【问题标题】:Toggle two different elements in DataTemplate using Style Triggers使用样式触发器在 DataTemplate 中切换两个不同的元素
【发布时间】:2016-02-12 11:26:44
【问题描述】:

我在 ViewModel 中有一个对象,其属性由数据模板显示。屏幕还有一个按钮,用于切换 ViewModel 中的 IsEditing 标志,这应该使对象属性可编辑,如下所示:

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

我知道如何使用两个完全独立的 DataTemplate 来实现这一点,使用 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>

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

我想的另一种选择是使用在样式中定义的单个模板,并使用触发器单独更改字段,但我不知道该怎么做,甚至根本不知道。

【问题讨论】:

    标签: wpf datatemplate datatrigger wpf-style


    【解决方案1】:

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

    【讨论】:

    • 嗯,这是个好主意!我通过在表单中​​的每个字段使用ContentControl 和 Style(就像我的问题中的示例)获得了一个工作选项,但这很快就变得一团糟!你的选择要好得多!明天上班想一想,然后过来发表一些意见。非常感谢!
    • 您的解决方案很简单,解决了避免大量样板文件的问题...谢谢!
    • (好吧,但最后我立即使用了一个 ComboBox,只是设置了在禁用时看起来像 TextBlock 的样式,使背景和边框笔刷透明)。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-19
      • 1970-01-01
      • 1970-01-01
      • 2020-08-14
      • 2012-09-23
      • 2012-10-09
      • 2013-10-11
      • 1970-01-01
      相关资源
      最近更新 更多