使用样式触发器切换 DataTemplate 中的两个不同元素
Toggle two different elements in DataTemplate using Style Triggers
我在 ViewModel 中有一个对象,其属性由数据模板显示。屏幕还有一个按钮,用于切换 ViewModel 中的 IsEditing
标志,这应该使对象属性可编辑,如下所示:
- 名称应从 TextBlock 更改为 TextBox;
- 颜色应从彩色矩形更改为具有颜色选项的组合框;
- 类别应从 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 单独更改字段,但我不知道该怎么做,或者即使它是可能的。
ControlTemplate 仅在生成 UI 元素时使用。如果您在生成项目后更改模板,生成的项目将不会更改。
您也不能使用触发器将 TextBox 更改为 TextBlock,反之亦然。
您唯一的选择确实是将布局镜像两次,然后 hide/display 通过数据绑定 属性。
您可以使用一个模板。
在模板中添加 TextBlock 和 TextBox,对于原始模板上的所有其他控件也是如此。
将控件可见性绑定到 bool 到可见性转换器。 (或使用触发器)每次只会看到一组控件(基于 IsEditing 标志)
我在 ViewModel 中有一个对象,其属性由数据模板显示。屏幕还有一个按钮,用于切换 ViewModel 中的 IsEditing
标志,这应该使对象属性可编辑,如下所示:
- 名称应从 TextBlock 更改为 TextBox;
- 颜色应从彩色矩形更改为具有颜色选项的组合框;
- 类别应从 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 单独更改字段,但我不知道该怎么做,或者即使它是可能的。
ControlTemplate 仅在生成 UI 元素时使用。如果您在生成项目后更改模板,生成的项目将不会更改。
您也不能使用触发器将 TextBox 更改为 TextBlock,反之亦然。
您唯一的选择确实是将布局镜像两次,然后 hide/display 通过数据绑定 属性。
您可以使用一个模板。 在模板中添加 TextBlock 和 TextBox,对于原始模板上的所有其他控件也是如此。 将控件可见性绑定到 bool 到可见性转换器。 (或使用触发器)每次只会看到一组控件(基于 IsEditing 标志)