有选择地重用DataType-keyed DataTemplate

时间:2018-04-20 04:00:27

标签: wpf xaml

我有一个项目,我希望在其中显示不同类型的项目集合 - 在我的初始案例boolstringStringList中,它实际上只是{{} 1}}。

我想要做的是将每个项目渲染为可以编辑该项目的适当控件 - 例如,CheckBox,TextBox,DataGrid。

我可以通过添加DataType键控的DataTemplate资源来完成所有这些工作。但是,此处的问题变得能够有选择地重用这些模板,而无需在项目范围内应用它们。毕竟,我当然不希望每一段ObservableCollection<string>内容成为TextBox!现在我通过将资源添加到单个控件的资源集合来限制范围,这非常有效,除非我想创建第二个这样的控件,我将复制并粘贴大量的模板代码,这似乎不对。

允许选择性重复使用此选项的最佳方法是什么?这是我目前拥有的一个例子:

string

2 个答案:

答案 0 :(得分:1)

您可以将要重复使用的数据模板资源定义为一个单独的文件ResourceDictionary,然后使用合并的字典在用户控件中使用它们。

在这里查看https://blogs.msdn.microsoft.com/wpfsldesigner/2010/06/03/creating-and-consuming-resource-dictionaries-in-wpf-and-silverlight/

我希望它有所帮助。

答案 1 :(得分:1)

DataTemplates中定义ResourceDictionary,并将此ResourceDictionary添加到您希望应用模板的每个ContentControl

<ContentControl Grid.Column="1" Content="{Binding Value}" Padding="0,10,0,0" >
    <ContentControl.Resources>
        <ResourceDictionary Source="Dictionary1.xaml" />
    </ContentControl.Resources>
</ContentControl>

<强> Dictionary1.xaml:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <DataTemplate DataType="{x:Type sys:Boolean}">
        <CheckBox Width="64" IsChecked="{Binding Path=.}" />
    </DataTemplate>
    <DataTemplate DataType="{x:Type sys:String}">
        <TextBox Width="100" Text="{Binding Path=.}"/>
    </DataTemplate>
    <DataTemplate DataType="{x:Type ViewModel:StringList}">
        <DataGrid ItemsSource="{Binding Path=.}" AutoGenerateColumns="False" HeadersVisibility="None" CanUserAddRows="True" Width="100" Height="50">
            <DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding Path=.}" Width="*" />
            </DataGrid.Columns>
        </DataGrid>
    </DataTemplate>
</ResourceDictionary>