Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.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
Wpf ItemsControl与viewmodel的多个数据模板_Wpf_Silverlight_Data Binding_Mvvm_Viewmodel - Fatal编程技术网

Wpf ItemsControl与viewmodel的多个数据模板

Wpf ItemsControl与viewmodel的多个数据模板,wpf,silverlight,data-binding,mvvm,viewmodel,Wpf,Silverlight,Data Binding,Mvvm,Viewmodel,是否可以将画布作为模板的itemscontrol绑定到多个DataTemplates 我有2个集合,根据类型,我希望在画布上显示不同的控件 我不确定,但我可以考虑一个Viewmodel,它有两个可观察的集合。例如,如果我有“形状”和“连接”,我想在画布上同时显示它们?在诊断场景中 我想以mvvm的方式来做这件事,我不确定多数据模板方法是否正确,但我想到了这一点。 但我仍然有问题,让绑定在我的头脑中。如果我将DataContext设置为ViewModel,则似乎无法将2个集合绑定到items控件=

是否可以将画布作为模板的itemscontrol绑定到多个DataTemplates

我有2个集合,根据类型,我希望在画布上显示不同的控件

我不确定,但我可以考虑一个Viewmodel,它有两个可观察的集合。例如,如果我有“形状”和“连接”,我想在画布上同时显示它们?在诊断场景中

我想以mvvm的方式来做这件事,我不确定多数据模板方法是否正确,但我想到了这一点。 但我仍然有问题,让绑定在我的头脑中。如果我将DataContext设置为ViewModel,则似乎无法将2个集合绑定到items控件=( 我也对其他想法持开放态度


这可能吗?如果可能的话,绑定看起来会像一个数据模板选择器:或者
.

您可以在ViewModel中拥有
ObservableCollection
,并将ItemsControl的源绑定到此集合


然后,为了获得不同类型数据的不同外观,您可以使用两个不带x:Key的DataTemplates,但在您的资源中使用正确设置的DataType。ItemsControl将自动为您的项目选择适当的DataTemplate。

您可以创建多个
ObservableCollections
,然后绑定
项目资源到加入这些集合的

然后,在XAML中,您可以使用
DataType
属性为相应的类型创建不同的
DataTemplates
,如果将其放置在资源中,将自动应用类似样式。(如果
CollectionContainers
应该绑定,您也可以在MSDN上显示的XAML中创建组合)

示例代码:

ObservableCollection数据1=新的ObservableCollection(新员工[]
{
新员工(“Hans”、“程序员”),
新员工(“Elister”、“程序员”),
新员工(“Steve”、“GUI设计师”),
新员工(“Stefan”、“GUI设计师”),
新员工(“乔”,“咖啡能手”),
新员工(“朱利安”、“程序员”),
});
ObservableCollection数据2=新的ObservableCollection(新机器[]
{
新机器(“E12”、“GreedCorp”),
新机器(“E11”、“GreedCorp”),
新机器(“F1-MII”、“商业公司”),
新机器(“F2-E5”、“商业公司”)
});
CompositeCollection coll=新的CompositeCollection();
coll.Add(new CollectionContainer(){Collection=data1});
coll.Add(new CollectionContainer(){Collection=data2});
数据=coll;


这里我使用不同的面板,但画布应该是相同的。

另一个代码较少的选项是定义两个列表框,每个列表框都有自己的模板并绑定到自己的集合。在相同的物理空间中定义每个列表框,并根据您的状态控制哪个列表框可见。您甚至可以使用t可视化状态管理器和自定义状态。

WPF和Silverlight都需要它吗?从长远来看,两者都很好……但第一个WPF将非常好……DataTemplateSelector将同时适用于
WPF
Silverlight
。不幸的是,COmpositeCollection不适用于UWP框架。如果Employee和Machine类是both继承自同一个类X,不需要CompositeCollection,一个ObservableCollection的X就足够了。@Viliam:当然,但这是一个主要的假设,在很多情况下是不成立的。
<ItemsControl ItemsSource="{Binding Data}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <VirtualizingStackPanel/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.Resources>
        <DataTemplate DataType="{x:Type local:Employee}">
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding Name}"/>
                <TextBlock Text=" ("/>
                <TextBlock Text="{Binding Occupation}"/>
                <TextBlock Text=")"/>
            </StackPanel>
        </DataTemplate>
        <DataTemplate DataType="{x:Type local:Machine}">
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding Model}"/>
                <TextBlock Text=" - "/>
                <TextBlock Text="{Binding Manufacturer}"/>
            </StackPanel>
        </DataTemplate>
    </ItemsControl.Resources>
</ItemsControl>