我试图以某种方式修改现有的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。正如您所看到的,它们不是同一个类,所以我不能交换它们。出于这个原因,我添加了一个属性,它将在PlacesCompound类中返回两个属性中的任何一个,这是一个只有两个属性而没有其他属性的类。
在相应的用户控件(让我们称之为ActivitiesView) )中,我们有一个绑定到ViewModel的DataGrid,还有一个TabItem,它将显示一个自定义usercontrol places,它绑定到ViewModel上的VuG1。我已经复制并修改了它,这样它就可以处理VuG2数据了。我创建了一个定制的DataTemplateSelector,它将根据PlacesCompound的哪个变量不是null来决定使用哪个模板。
在VUActivitiesResources.xaml中,我声明了两个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>在ActivitiesView中,VUActivitiesResources.xaml被称为UserControl.Resources。
在ActivitiesView中,我在TabItem中放置了一个ItemsControl,取代了自定义的places UserControl (ive也尝试了ListBox而不是ItemsControl,但两者都不起作用)
<TabItem IsEnabled="{Binding PlacesIsVisible}">
...
<ItemsControl
ItemsSource="{Binding VuP}"
ItemTemplateSelector="{StaticResource PlacesTemplateSelector}"></ItemsControl>
</TabItem>我的问题是:为什么从来不使用PlacesTemplateSelector,以及如何使它被使用?因为现在,在调试过程中,我可以看到在ViewModel中,VuP正确地返回了一个PlacesCompound对象,但是从未输入选择器。我希望两个DataTemplates中的一个出现在TabItem中,而现在没有一个在显示。
发布于 2021-03-26 14:22:28
ItemsSource必须是一个集合(而您的PlacesCompound不是),在您的情况下,这将是VuG1或VuG2。如果这两个项类没有公共基类,则仍然可以使用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}" />https://stackoverflow.com/questions/66818381
复制相似问题