Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在ItemsControl中设置特定项目类型的样式_C#_Wpf - Fatal编程技术网

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