使用样式触发器在DataTemplate中切换两个不同的元素

时间:2015-11-11 11:16:37

标签: wpf datatemplate datatrigger wpf-style

我在ViewModel中有一个对象,其属性由datatemplate显示。屏幕上还有一个按钮,可以在ViewModel中切换IsEditing标志,这样可以使对象属性可编辑,如下所示:

  • 名称应从TextBlock更改为TextBox;
  • 颜色应从彩色矩形更改为带有颜色选项的ComboBox;
  • 类别应从TextBlock更改为ComboBox;

我知道如何用两个完全独立的DataTemplates实现它,使用Style和DataTrigger在它们之间切换:

<ContentControl Content="{Binding FancyObject}">
    <ContentControl.Style>
        <Style TargetType="ContentControl">
            <Setter Property="ContentTemplate" Value="{StaticResource DisplayTemplate}"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding DataContext.IsEditing, ElementName=UserControl}" Value="True">
                    <Setter Property="ContentTemplate" Value="{StaticResource EditTemplate}"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ContentControl.Style>
</ContentControl>

目前DisplayTemplate是这样的:

<DataTemplate x:Key="DisplayTemplate" DataType="my:FancyObject">
    <Border>
        <DockPanel DataContext="{Binding Metadata}">
            <Border>
                <TextBlock Text="{Binding Name}"/>
            </Border>           
            <DataGrid
                AutoGenerateColumns="False"
                ItemsSource="{Binding FancyObjectCollection}">
                <DataGrid.Columns>
                    <!-- Text and Template columns -->
                </DataGrid.Columns>
            </DataGrid> 
        </DockPanel>
    </Border>                   
</DataTemplate>

问题是:使用两个独立但相似的模板意味着重复布局,因为只有一些字段会改变,但整体结构是相同的。

我想到的另一个选择是使用Style中定义的单个模板,并使用Trigger单独更改字段,但我不知道如何操作,或者甚至根本不可能。

2 个答案:

答案 0 :(得分:1)

您可以使用一个模板。 在模板中添加TextBlock和TextBox,对原始模板上的所有其他控件都相同。 将控件可见性绑定到bool到可见性转换器。 (或使用触发器)每次只能看到一组控件(基于IsEditing标志)

答案 1 :(得分:0)

ControlTemplate仅在生成UI元素时使用。如果在生成项目后更改模板,则生成的项目不会更改。

您也不能使用触发器将TextBox更改为TextBlock,反之亦然。

您唯一的选择确实是将布局镜像两次并通过数据绑定属性隐藏/显示它。