DataTrigger 不更改文本 属性

DataTrigger does not change Text property

我正在尝试使用样式上的数据触发器来更改 属性。

符合“Minimal, Complete and Verifiable Example”的要求...

要重现,首先在Visual Studio中创建一个WPF应用程序。

在 App.xaml.cs 内:

using System.ComponentModel;
using System.Windows;

namespace Foo{
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application, INotifyPropertyChanged {
        private bool _clicked;
        public bool Clicked {
            get { return this._clicked; }
            set {
                this._clicked = value;
                this.PropertyChanged?.Invoke(
                    this, new PropertyChangedEventArgs( "Clicked" ) );
            }
        }
        public event PropertyChangedEventHandler PropertyChanged;
    }
}

在 MainWindow.xaml 内:

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:lib="clr-namespace:System;assembly=mscorlib"
    xmlns:local="clr-namespace:Foo"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    mc:Ignorable="d" x:Class="Foo.MainWindow"
    Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <lib:Boolean x:Key="True">True</lib:Boolean>
    </Window.Resources>
    <Grid>
        <Button x:Name="button" Click="button_Click">
            <Viewbox>
                <TextBlock Text="Unclicked">
                    <TextBlock.Style>
                        <Style TargetType="{x:Type TextBlock}">
                            <Style.Triggers>
                                <DataTrigger
                                        Binding="{Binding
                                            Clicked,
                                            Source={x:Static Application.Current}}"
                                            Value="{StaticResource True}">
                                    <Setter Property="Text" Value="Clicked" />
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </TextBlock.Style>
                </TextBlock>
            </Viewbox>
        </Button>
    </Grid>
</Window>

在 MainWindow.xaml.cs 内 -

using System.Windows;

namespace Foo{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window {
        public MainWindow( ) {
            InitializeComponent( );
        }

        private void button_Click( object sender, RoutedEventArgs e ) {
            ( Application.Current as App ).Clicked = !( Application.Current as App ).Clicked;
        }
    }
}

作为旁注 - 我尝试将数据触发器的值设置为 "True",但这也没有用(触发器没有捕获,并且文本没有根据设置 属性 到一个新值)。

那么为什么数据触发器在这里没有捕获或工作? (使用静态资源或文字值)?更相关 - 为什么我会收到此错误? "After a 'DataTrigger' is in use (sealed), it cannot be modified" 错误?完成我在这里要做的事情的正确方法是什么? (最好仍然使用数据触发器而不是转换器,因为我确实需要在两个值之间切换)。

分配给 TextBlock 的文本 属性 的 本地值 的优先级高于 DataTrigger 中 Setter 提供的值。有关详细信息,请参阅 Dependency Property Value Precedence

通过另一个设置初始文本值Setter:

<TextBlock>
    <TextBlock.Style>
        <Style TargetType="TextBlock">
            <Setter Property="Text" Value="Unclicked"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding Clicked,
                                       Source={x:Static Application.Current}}"
                             Value="{StaticResource True}">
                    <Setter Property="Text" Value="Clicked" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TextBlock.Style>
</TextBlock>

您在使用布尔资源时看到的错误消息只是 XAML 设计师的抱怨。运行时没有报错。