2010-03-16 48 views
3

你们如何将数据(参数)传递给DataTemplate选择器?将数据传递给数据模板选择器

我能想到的唯一一个是在DataTemplate Selector中使用附加属性?

例子:

public class DisableWeekendsSelection : DataTemplateSelector 
    { 
     [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2211:NonConstantFieldsShouldNotBeVisible", Justification = "DependencyProperty")] 
     public static readonly DependencyProperty Parameter = 
      DependencyProperty.RegisterAttached("Parameter", typeof(ObservableCollection<Date>), typeof(DisableWeekendsSelection), 
      new FrameworkPropertyMetadata(null, 
       FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)); 

     public static ObservableCollection<Date> GetParameter(DependencyObject dp) 
     { 
      return dp.GetValue(Parameter) as ObservableCollection<Date>;    
     } 

     public static void SetParameter(DependencyObject dp, ObservableCollection<Date> value) 
     {    
      dp.SetValue(Parameter, value); 
     } 

     public override DataTemplate SelectTemplate(object item, DependencyObject container) 
     { 

这种方法的问题是,我没能得到SelectTemplate方法参数的值。

任何建议,将不胜感激。提前致谢。

回答

0

解决办法

  1. 使用附加属性和私有静态变量

  2. 走可视化树doc.OfParentType <>

0

通常的解决方案是使用item参数的属性来获取所需的信息以选择正确的模板。

如果您有ViewModel,它可以包含必要的数据。

+0

我有日期财产和节假日物业。 DatePicker绑定了Date。我需要在DatePicker的日历中突出显示假期。这就是为什么林尝试将虚拟机假期传递给数据模板选择器。 – 2010-03-17 00:09:10

+0

我总是得到空,如果我把这一行var日期= container.GetValue(参数)作为ObservableCollection ;在SelectTemplate中。 :( – 2010-03-17 07:11:11

+0

你可以在telerik:RadDatePicker中显示如何设置数据模板选择器? – Timores 2010-03-17 07:29:11

3

这是一个相当容易一点。在处理程序中:

SelectTemplate(object item, DependencyObject container) 

容器位于逻辑树中。您可以递增树来访问您的UserControl,然后您可以访问该控件属性和DataContext。就像这样:

public override DataTemplate SelectTemplate(object item, DependencyObject container) 
{ 
    var _Container = Library.TreeHelper.TryFindParent<MyUserControl>(container); 

这里的辅助方法:http://www.hardcodet.net/2009/06/finding-elements-in-wpf-tree-both-ways