4

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

在 XAML 中,我想知道是否有一种方法可以ListView.ItemTemplate根据它在ObservableCollection<IRuleCondition>? 还是我需要实现两个不同ObservableCollection的s?

4

3 回答 3

10

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

这就是对象的定义方式

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();
        }
    }

这是主窗口 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>

如您所见,有两个数据模板,一个用于经理,一个用于员工

在此处输入图像描述

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

于 2013-03-29T02:57:45.817 回答
2

只需在“资源”部分定义两个不同的 DataTemplate,一个用于每个 RuleCondition 类型。

于 2013-03-29T02:38:25.413 回答
1

1)创建两个不同的数据模板,就像你说你已经完成的那样。2)创建一个自定义的DataTemplateSelector来选择合适的模板。

您的其中一条评论指出您的 DataTemplateSelector 出现错误。验证您是否正确实现了该类,也许粘贴您的实现。它应该相当小且简单。

于 2013-03-29T02:57:37.893 回答