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需要设置为“页面”才能正常工作,感谢您的帮助:)