在自定义控件中替换DataTemplate

时间:2014-08-21 15:16:27

标签: wpf

我有一个程序集MyAssembly,其中包含一个自定义的WPF控件MyControl。此控件显示不同类型的对象,并且使用此类型特定的数据模板:

<MyControl.Resources>
  <DataTemplate DataType="{x:Type local:MyFirstType}">
     ...
  </DataTemplate>
  <DataTemplate DataType="{x:Type local:MySecondType}">
     ...
  </DataTemplate>
</MyControl.Resources>

问: 如何让程序员定义替换MyControl创建的UI的新数据模板?这里的共同设计原则是什么?

1 个答案:

答案 0 :(得分:0)

尝试使用ItemTemplateSelector / ContentTemplateSelector。 ContentTemplateSelector ItemTemplateSelector

    public class TaskListDataTemplateSelector : DataTemplateSelector
{
    public override DataTemplate
        SelectTemplate(object item, DependencyObject container)
    {
        FrameworkElement element = container as FrameworkElement;

        if (element != null && item != null && item is Task)
        {
           //Set Template based on conditions
            Task taskitem = item as Task;

            if (taskitem.Priority == 1)
                return
                    element.FindResource("importantTaskTemplate") as DataTemplate;
            else 
                return
                    element.FindResource("myTaskTemplate") as DataTemplate;
        }

        return null;
    }
}


<Window.Resources>

<local:TaskListDataTemplateSelector x:Key="myDataTemplateSelector"/>

</Window.Resources>

<ListBox Width="400" Margin="10"
     ItemsSource="{Binding Source={StaticResource myTodoList}}"
     ItemTemplateSelector="{StaticResource myDataTemplateSelector}"
     HorizontalContentAlignment="Stretch"/>

我希望这会给你一个想法。