WPF和ObservableCollection<T>

4
我有一个名为ObservableCollection<IRuleCondition>的集合,我希望将其显示出来 - IRuleCondition 接口被2个不同的类使用,一个是 RuleCondition 类简单地显示一个规则条件(例如优先级、要检查的属性等),另一个是 RuleConditionGroup 类,可以包含2个或更多的 RuleConditions ,这些条件按照任意或全部等方式分组。

在XAML中,我想知道是否有一种方法可以根据 ObservableCollection<IRuleCondition> 中遇到的类型来显示不同的 ListView.ItemTemplate?还是说我需要实现两个不同的 ObservableCollection


DataTemplate 可能会解决您的问题。 - parapura rajkumar
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();
        }
    }

这是 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>

正如您所看到的,有两个数据模板,一个是经理的,另一个是员工的。

enter image description here

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


尝试以这种方式实现,但每次尝试启动它时都会显示“无法从文本'local:EditableRuleConditionModel'创建'Type'。”行号为'13',行位置为'53'。然而,智能感知功能可以很好地识别我的类名等:S - KingTravisG
尝试打开所有异常,并观察绑定失败的输出窗口。 - parapura rajkumar
现在尝试一下 - 不知何故,当我将资源文件中的所有DataTemplate内容复制到主.xaml文件中时,它可以正常工作! - KingTravisG
终于搞定了...原来ResourceDictionary文件需要设置为“Page”而不是“Resource”,现在突然一切都正常了,谢谢! :) - KingTravisG

2
只需在资源部分定义两个不同的DataTemplates,一个用于每种RuleCondition类型。

我已经在资源文件中有类似的东西了,但我不确定如何切换它们-我一直在使用这个例子,但出现了一个问题,我的DataTemplateSelector类一直提示“无法创建未知类型”。 - KingTravisG
抱歉,我忘记了我一直在使用的示例的链接! - KingTravisG

1

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

你的一条评论表明你从DataTemplateSelector中得到了一个错误。请验证你是否正确实现了该类,也许可以粘贴你的实现代码。它应该相当小而直接。


是的,我发现问题所在了,ResourceFile需要设置为“Page”才能正常工作,感谢您的帮助 :) - KingTravisG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接