C# WPF和可观测采集<;T>;

C# WPF和可观测采集<;T>;,c#,.net,wpf,observablecollection,C#,.net,Wpf,Observablecollection,我有一个要显示的observateCollection,IRuleCondition接口被我要显示的两个不同的类使用,一个RuleCondition,它只显示一个规则条件(如优先级、要检查的属性等信息)和一个RuleConditionGroup,可以包含2个或多个规则条件,以任何条件都可以匹配的方式分组,或全部等 在XAML中,我想知道是否有一种方法可以显示不同的ListView.ItemTemplate,这取决于它在ObservableCollection中遇到的类型?或者我需要实现两个不同的

我有一个要显示的
observateCollection
IRuleCondition
接口被我要显示的两个不同的类使用,一个
RuleCondition
,它只显示一个规则条件(如优先级、要检查的属性等信息)和一个
RuleConditionGroup
,可以包含2个或多个
规则条件
,以任何条件都可以匹配的方式分组,或全部等


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

只需在参考资料部分定义两个不同的数据模板,每个RuleCondition类型对应一个。

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


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

这里是一个简单的例子,说明了它是如何工作的

这就是对象的定义方式

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;}
}
这是后面的主窗口代码

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();
        }
    }
公共部分类主窗口:窗口
{
ObservableCollection mPeople=新的ObservableCollection();
公众观察收集人
{
得到
{
回归人民;
}
}
公共主窗口()
{
DataContext=this;
mPeople.Add(新员工{Name=“x”,ManagerName=“foo”});
mPeople.Add(新经理{Name=“y”});
初始化组件();
}
}
这是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>

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


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

DataTemplate可能会解决您的问题我的资源文件中已经有类似的内容,但我不确定如何切换它们-我一直在使用此示例,但出于某种原因,我不断得到一个“无法创建未知类型”从我的DataTemplateSelector类抱歉,忘记了我一直在使用的示例的链接!尝试这样做,但每次我尝试并启动它时,它都会显示“未能从文本“local:EditableRuleConditionModel”创建“类型”。“行号“13”和行位置“53”。然而intellisense正在收集我的类名,等等,很好:STry打开所有异常并观察绑定失败的输出窗口现在尝试一下——出于某种原因,当我处理资源文件中的所有DataTemplate内容并将其放入主.xaml文件时,它没有问题!终于明白了。。。原来ResourceDictionary文件需要设置为“页面”而不是“资源”,突然之间,一切都正常了,谢谢!)是的,我发现了问题所在,ResourceFile需要设置为“页面”才能正常工作,感谢您的帮助:)