未使用 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.xaml
在 ActivitiesView 中被引用为 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}" />
我正在尝试以某种方式修改现有的 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.xaml
在 ActivitiesView 中被引用为 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}" />