首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不使用WPF DataTemplateSelector

不使用WPF DataTemplateSelector
EN

Stack Overflow用户
提问于 2021-03-26 14:00:33
回答 1查看 49关注 0票数 0

我试图以某种方式修改现有的WPF应用程序,以便一些数据对象的更新版本可以与旧的应用程序一起使用。因此,我通过将现有的ViewModel扩展到不能重用旧字段的新字段,从而避免了冗余代码。

代码语言:javascript
复制
 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一个。

代码语言:javascript
复制
<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,但两者都不起作用)

代码语言:javascript
复制
<TabItem IsEnabled="{Binding PlacesIsVisible}">
    ...
    <ItemsControl
         ItemsSource="{Binding VuP}"
         ItemTemplateSelector="{StaticResource PlacesTemplateSelector}"></ItemsControl>
</TabItem>

我的问题是:为什么从来不使用PlacesTemplateSelector,以及如何使它被使用?因为现在,在调试过程中,我可以看到在ViewModel中,VuP正确地返回了一个PlacesCompound对象,但是从未输入选择器。我希望两个DataTemplates中的一个出现在TabItem中,而现在没有一个在显示。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-26 14:22:28

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

代码语言:javascript
复制
public IEnumerable VuP => (IEnumerable)VuG1 ?? VuG2;

然后,与其编写TemplateSelector,不如让WPF DataTemplating机制完成它的工作:

代码语言:javascript
复制
<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}" />
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66818381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档