未使用 WPF DataTemplateSelector

WPF DataTemplateSelector is not used

我正在尝试以某种方式修改现有的 WPF 应用程序,以便某些数据对象的新版本可以与旧版本一起使用。因此,我通过使用无法重用旧字段的新字段扩展现有 ViewModel 来避免冗余代码。

 public IList<G1VU.PDR> VuG1 { get; set; }
 public IList<G2VU.PDR> VuG2 { get; set; }
 public PlacesCompound VuP
 {
     get
     {
         if (VuG1 != null && VuG2 == null)
         {
            return new PlacesCompound {
                 G1 = VuG1,
                 G2 = null
             };
         }
         if (VuG2 != null && VuG1 == null)
         {
            return new PlacesCompound {
                G1 = null,
                G2 = VuG2
             };
         }

         throw new Exception("G1 and G2 data present or no data present");
     }
 }

VuG1 之前已经存在,我为新数据添加了一个新的 属性 VuG2。如您所见,它们并不相同 class,因此我无法互换它们。出于这个原因,我添加了一个 属性,它将 return PlacesCompound class 中的两个中的任何一个,这只是一个具有两个属性的 class 和没有别的。

在相应的用户控件中(我们称之为 ActivitiesView)我们有一个绑定到 ViewModel 的 DataGrid 和一个将显示自定义 UserControl places 的 TabItem绑定到 ViewModel 上的 VuG1。我已经复制并更改了它,因此它可以与 VuG2 数据一起使用。 我创建了一个自定义 DataTemplateSelector,它将根据 PlacesCompound 的哪个变量不是 null.

来决定使用什么模板

VUActivitiesResources.xaml 中,我声明了 2 个 DataTemplates,每个 places UserControl 和 DataTemplateSelector。

<activities:VUActivitiesViewDataTemplateSelector x:Key="PlacesTemplateSelector"/>

<DataTemplate x:Key="VuG2Template">
    <places:VUPViewG2 DataContext="{Binding VuG2}" HorizontalAlignment="Left"/>
</DataTemplate>
    
<DataTemplate x:Key="VuG1Template">
    <places:VUPViewG1 DataContext="{Binding VuG1}" HorizontalAlignment="Left"/>
</DataTemplate>

VUActivitiesResources.xamlActivitiesView 中被引用为 UserControl.Resources.

ActivitiesView 中,我在 TabItem 中放置了一个 ItemsControl 来替换自定义的 places UserControl(我也尝试过使用 ListBox 而不是 ItemsControl,但都不起作用)

<TabItem IsEnabled="{Binding PlacesIsVisible}">
    ...
    <ItemsControl
         ItemsSource="{Binding VuP}"
         ItemTemplateSelector="{StaticResource PlacesTemplateSelector}"></ItemsControl>
</TabItem>

我的问题:为什么 PlacesTemplateSelector 从未被使用过,我该如何让它被使用?因为现在在调试时我可以在 ViewModel VuP returns 中正确看到一个 PlacesCompound 对象,但从未输入选择器。我希望两个 DataTemplates 之一显示在 TabItem 中,现在 none 正在显示。

ItemsSource 必须是一个集合(您的 PlacesCompound 不是),在您的情况下,这可能是 VuG1 或 VuG2。如果这两项 classes 没有公共基础 class,你仍然可以使用 IEnumerable:

public IEnumerable VuP => (IEnumerable)VuG1 ?? VuG2;

然后,不用编写 TemplateSelector,只需让 WPF DataTemplating 机制完成它的工作即可:

<DataTemplate DataType="{x:Type namespace1:PDR}">
    <places:VUPViewG2 HorizontalAlignment="Left"/>
</DataTemplate>
    
<DataTemplate DataType="{x:Type namespace2:PDR}">
    <places:VUPViewG1 HorizontalAlignment="Left"/>
</DataTemplate>

<ItemsControl ItemsSource="{Binding VuP}" />