将数据传递给数据模板选择器

时间:2010-03-16 16:38:07

标签: wpf

你们如何将数据(参数)传递给DataTemplate Selector?

我唯一能想到的是在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方法中获取Parameter的值。

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

变通方法

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

  2. 走可视树doc.OfParentType&lt;&gt;