DataTrigger 在 ToggleButton 单击时更改 TextBlock 文本
DataTrigger to change TextBlock text on ToggleButton click
我试图在单击 TextBlock 所在的 ToggleButton 时更改 TextBlock 的文本。TextBlock 与图像一起位于 StackPanel 中,StackPanel 位于 ToggleButton 的 DataTemplate 中.
我正在尝试使用 ViewModel 中名为 EditState 的 属性 来完成此操作。单击 ToggleButton 时,EditState 属性 成功更改为“True”,因此问题不在 ViewModel 中。
没有错误显示,TextBlock 的文本不会改变。这是我目前的 XAML 代码:
<ToggleButton x:Name="btnEdit" Grid.ColumnSpan="1" Command="{Binding EditCommand}"
IsEnabled="{Binding CanEdit}" MinWidth="168">
<ToggleButton.Style>
<Style TargetType="{x:Type ToggleButton}">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate DataType="{x:Type ToggleButton}">
<StackPanel Orientation="Horizontal">
<Image Source="/Resources/IconEdit.jpg" Height="20">
<Image.Style>
<Style TargetType="Image">
<Style.Triggers>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Opacity" Value="0.2" />
</Trigger>
</Style.Triggers>
</Style>
</Image.Style>
</Image>
<TextBlock x:Name="tbkEdit" Text="Enable Editing" Margin="5" />
</StackPanel>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding EditState}" Value="True">
<Setter TargetName="tbkEdit" Property="Text"
Value="Cancel Editing"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</ToggleButton.Style>
</ToggleButton>
我正在寻找与 MVVM 一致的解决方案。这是我第一次使用 WPF 并使用 MVVM 开发项目。如果有人能纠正我的错误或指出正确的方向,我将不胜感激。
"符合 MVVM 的解决方案" 是您在设置控件样式时的一种误解。这只是一个视图元素,不应依赖于任何视图模型。 MVVM 与此处无关。
ContentTemplate 中的 TextBlock 应通过 Text="{Binding}"
显示 ToggleButton 的 Content
属性,内容 属性 应由样式 Setter 设置并由 ToggleButton 的 IsChecked
属性.
上的样式触发器更改
另请注意,ContentTemplate 上的 DataType="{x:Type ToggleButton}"
毫无意义且不正确。 DataType 用于自动使用 DataTemplate 资源,此处不会发生这种情况。并且它应该匹配内容的类型,而不是控件的类型。
<ToggleButton ...>
<ToggleButton.Style>
<Style TargetType="ToggleButton">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Image ...>
...
</Image>
<TextBlock Text="{Binding}" Margin="5"/>
</StackPanel>
</DataTemplate>
</Setter.Value>
</Setter>
<Setter Property="Content" Value="Enable Editing"/>
<Style.Triggers>
<Trigger Property="IsChecked" Value="True">
<Setter Property="Content" Value="Cancel Editing"/>
</Trigger>
</Style.Triggers>
</Style>
</ToggleButton.Style>
</ToggleButton>
我试图在单击 TextBlock 所在的 ToggleButton 时更改 TextBlock 的文本。TextBlock 与图像一起位于 StackPanel 中,StackPanel 位于 ToggleButton 的 DataTemplate 中.
我正在尝试使用 ViewModel 中名为 EditState 的 属性 来完成此操作。单击 ToggleButton 时,EditState 属性 成功更改为“True”,因此问题不在 ViewModel 中。
没有错误显示,TextBlock 的文本不会改变。这是我目前的 XAML 代码:
<ToggleButton x:Name="btnEdit" Grid.ColumnSpan="1" Command="{Binding EditCommand}"
IsEnabled="{Binding CanEdit}" MinWidth="168">
<ToggleButton.Style>
<Style TargetType="{x:Type ToggleButton}">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate DataType="{x:Type ToggleButton}">
<StackPanel Orientation="Horizontal">
<Image Source="/Resources/IconEdit.jpg" Height="20">
<Image.Style>
<Style TargetType="Image">
<Style.Triggers>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Opacity" Value="0.2" />
</Trigger>
</Style.Triggers>
</Style>
</Image.Style>
</Image>
<TextBlock x:Name="tbkEdit" Text="Enable Editing" Margin="5" />
</StackPanel>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding EditState}" Value="True">
<Setter TargetName="tbkEdit" Property="Text"
Value="Cancel Editing"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</ToggleButton.Style>
</ToggleButton>
我正在寻找与 MVVM 一致的解决方案。这是我第一次使用 WPF 并使用 MVVM 开发项目。如果有人能纠正我的错误或指出正确的方向,我将不胜感激。
"符合 MVVM 的解决方案" 是您在设置控件样式时的一种误解。这只是一个视图元素,不应依赖于任何视图模型。 MVVM 与此处无关。
ContentTemplate 中的 TextBlock 应通过 Text="{Binding}"
显示 ToggleButton 的 Content
属性,内容 属性 应由样式 Setter 设置并由 ToggleButton 的 IsChecked
属性.
另请注意,ContentTemplate 上的 DataType="{x:Type ToggleButton}"
毫无意义且不正确。 DataType 用于自动使用 DataTemplate 资源,此处不会发生这种情况。并且它应该匹配内容的类型,而不是控件的类型。
<ToggleButton ...>
<ToggleButton.Style>
<Style TargetType="ToggleButton">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Image ...>
...
</Image>
<TextBlock Text="{Binding}" Margin="5"/>
</StackPanel>
</DataTemplate>
</Setter.Value>
</Setter>
<Setter Property="Content" Value="Enable Editing"/>
<Style.Triggers>
<Trigger Property="IsChecked" Value="True">
<Setter Property="Content" Value="Cancel Editing"/>
</Trigger>
</Style.Triggers>
</Style>
</ToggleButton.Style>
</ToggleButton>