c# - DataTrigger不會更改Text屬性



wpf xaml (1)

我試圖在樣式上使用數據觸發器來更改屬性。

符合“ 最小,完整和可驗證的例子 ”要求......

要重現,首先在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" ,並且也不起作用(觸發器沒有捕獲,並且文本沒有根據將屬性設置為新值而更改)。

那麼為什麼數據觸發器沒有捕獲或在這里工作? (使用靜態資源或文字值)? 更相關 - 為什麼我會收到此錯誤? “在使用'DataTrigger'之後(密封),它無法修改”錯誤? 什麼是完成我在這裡嘗試做的正確方法? (最好仍然使用數據觸發而不是轉換器,因為我需要在兩個值之間切換)。


分配給TextBlock的Text屬性的 本地值 的優先級高於DataTrigger中Setter提供的值。 有關詳細信息,請參閱 依賴項屬性值優先級

由另一個Setter設置初始Text值:

<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設計者抱怨。 運行時沒有錯誤。





datatrigger