微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

wpf – 具有Viewmodel的多个DataTemplates的ItemsControl

可以将canvas控件与模板绑定到多个DataTemplates吗?

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

我不确定,但我可以考虑一个viewmodel,它有2个ObservableCollections。例如,如果我有“形状”和“连接”,我想在画布上显示它们?在图示场景的情况下…

我想以mvvm的方式做到这一点,我不知道多个DataTemplate方法是否正确,但这是我的想法。
但是我仍然有问题要把我的头绑在一起。如果我将DataContext设置为viewmodel,似乎无法将2个集合绑定到项目控件… =(
我也是开放的其他想法,太….

这可能吗?如果是这样,绑定看起来如何

解决方法

您可以创建多个ObservableCollections,然后将ItemsSource绑定到加入这些集合的 CompositeCollection

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

示例代码

ObservableCollection<Employee> data1 = new ObservableCollection<Employee>(new Employee[]
{
    new Employee("Hans","Programmer"),new Employee("Elister",new Employee("Steve","GUI Designer"),new Employee("Stefan",new Employee("Joe","Coffee Getter"),new Employee("Julien",});
ObservableCollection<Machine> data2 = new ObservableCollection<Machine>(new Machine[]
{
    new Machine("E12","GreedCorp"),new Machine("E11",new Machine("F1-MII","CommerceComp"),new Machine("F2-E5","CommerceComp")
});
Compositecollection coll = new Compositecollection();
coll.Add(new CollectionContainer() { Collection = data1 });
coll.Add(new CollectionContainer() { Collection = data2 });
Data = coll;
<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>

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐