C# 在ItemsControl中设置特定项目类型的样式
我有一个C# 在ItemsControl中设置特定项目类型的样式,c#,wpf,C#,Wpf,我有一个ItemsControl,我用它在画布上绘制两组不同的形状。因此,我有两个itemsource包含边对象和节点对象 对于每种类型,我有两个不同的数据模板。但是,我需要为节点设置画布定位,而不是为边设置画布定位。互联网上有大量的例子说明如何使用单个ItemsSource,而不是像我这样使用多个 我已经像这样对它进行了黑客攻击,但这会在输出窗口中抛出大量绑定错误(因为只有节点具有位置属性,而不是边,因此这“有效”)。另外,我想分别为节点和边设置ZIndex,这是不可能的。有人有什么建议吗 你
ItemsControl
,我用它在画布上绘制两组不同的形状。因此,我有两个itemsource
包含边对象和节点对象
对于每种类型,我有两个不同的数据模板。但是,我需要为节点设置画布定位,而不是为边设置画布定位。互联网上有大量的例子说明如何使用单个ItemsSource
,而不是像我这样使用多个
我已经像这样对它进行了黑客攻击,但这会在输出窗口中抛出大量绑定错误(因为只有节点具有位置
属性,而不是边,因此这“有效”)。另外,我想分别为节点和边设置ZIndex
,这是不可能的。有人有什么建议吗
你做的事情有点奇怪。。我不知道你是否真的需要这样做
你不能把你的两个列表合并成一个简单的列表?像这样:
List<AChild> a;
List<BChild> b;
List<Mother> ab = a.Concat(b).Cast<Mother>();
列表a;
名单b;
列表ab=a.Concat(b.Cast();
在视图中,您可以使用TemplateSelector,它将帮助您选择适合该项的DataTemplate
<ItemsControl ItemTemplateSelector="{StaticResource YourTemplateSelector}" ItemsSource="{Binding ab}"/>
答案由Rachel在下面的StackOverflow线程中给出:
她真是太好了。答案的简短摘要:
使用转换器检查调用绑定的类型,并根据该类型返回值。为什么不使用?将样式添加到ItemsControl.Resources
:
<Style TargetType="ContentPresenter" x:Key="{x:Type model:Edge}">
<Setter Property="ZIndex">
...
</Setter>
</Style>
<Style TargetType="ContentPresenter" x:Key="{x:Type model:Node}">
<Setter Property="ZIndex">
...
</Setter>
<Setter Property="Canvas.Top">
...
</Setter>
<Setter Property="Canvas.Left">
...
</Setter>
</Style>
我不想合并这两个集合,ItemsSource
绑定可以完美地工作,所以这不是我的问题。另外,据我所见,TemplateSelector
与DataTemplate
一起工作,但我需要在画布上设置属性,这就是为什么我需要在ItemContainerStyle
中有单独的样式。我再次讨论了这个问题,并尝试了您的解决方案。它工作得很漂亮,比我的解决方案更优雅,因此接受了你的答案。谢谢
public override Style SelectStyle(object item, DependencyObject container) {
var containerElement = (FrameworkElement)container;
var style = containerElement.TryFindResource(item.GetType()) as Style;
if (style != null) {
return style;
}
return base.SelectStyle(item, container);
}