繁体   English   中英

WPF和ObservableCollection <T>

[英]WPF and ObservableCollection<T>

我有一个我要显示的ObservableCollection<IRuleCondition> - IRuleCondition接口由我想要显示的2个不同的类使用, RuleCondition只显示一个规则条件(诸如优先级,要检查的属性等信息),以及一个RuleConditionGroup ,可以包含2个或更多RuleConditions ,以任何条件可以匹配的方式分组,或者全部等。

在XAML中,我想知道是否有一种方法可以显示不同的ListView.ItemTemplate具体取决于它在ObservableCollection<IRuleCondition>遇到的类型? 或者我需要实现两个不同的ObservableCollection

这是一个如何工作的简单示例

这是对象的定义方式

public interface Person
{
    string Name { get; set; }
}

public class Manager : Person
{
    public string Name { get; set; }
}

public class Employee : Person
{
    public string Name { get; set; }
    public string ManagerName { get;set;}
}

这是后面的MainWindow代码

public partial class MainWindow : Window
    {
        ObservableCollection<Person> mPeople = new ObservableCollection<Person>();

        public ObservableCollection<Person> People
        {
            get
            {
                return mPeople;
            }
        }

        public MainWindow()
        {
            DataContext = this;
            mPeople.Add( new Employee{ Name = "x" , ManagerName = "foo"});
            mPeople.Add( new Manager { Name = "y"});

            InitializeComponent();
        }
    }

这是MainWindow XAML

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:my="clr-namespace:WpfApplication1"
        Title="MainWindow"
        Height="350"
        Width="525">
    <Window.Resources>
        <DataTemplate  DataType="{x:Type my:Employee}">
            <StackPanel Background="Green" Width="300">
                <TextBlock Text="{Binding Name}" />
                <TextBlock Text="{Binding ManagerName}" />
            </StackPanel>
        </DataTemplate>
        <DataTemplate  DataType="{x:Type my:Manager}">
            <StackPanel Background="Red"
                        Width="300">
                <TextBlock Text="{Binding Name}" />
            </StackPanel>
        </DataTemplate>

    </Window.Resources>
    <Grid>
        <ListBox ItemsSource="{Binding People}"></ListBox>
    </Grid>
</Window>

如您所见,有两个数据窗口,一个用于Manager,另一个用于Employee

在此输入图像描述

而这就是糟糕的输出效果。 请注意,与经理相比,员工显示的绿色和红色背景和额外字段

只需在参考资料部分定义两个不同的DataTemplates,每个RuleCondition类型一个。

1)创建两个不同的数据模板,就像你说的那样。 2)创建自定义DataTemplateSelector以选择适当的模板。

您的一条评论声明您从DataTemplateSelector收到错误。 验证您是否正确实现了类,也许粘贴您的实现。 它应该相当小而且直截了当。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM