c# - DataTrigger non modifica la proprietà Text



wpf xaml (1)

Sto tentando di utilizzare un trigger di dati su uno stile per modificare una proprietà.

In conformità con i requisiti " Esempio minimo, completo e verificabile " ...

Per riprodurre, creare prima un'applicazione WPF in Visual Studio.

All'interno di 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;
    }
}

All'interno di 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>

All'interno di 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;
        }
    }
}

Come nota a margine: ho provato a impostare il valore del trigger di dati su "True" e anche questo non ha funzionato (il trigger non ha funzionato e il testo non è cambiato in base all'impostazione della proprietà su un nuovo valore).

Quindi perché il trigger di dati non sta rilevando o funziona qui? (O con la risorsa statica o il valore letterale)? Ancora più pertinente: perché visualizzo questo errore? L'errore "Dopo che un" DataTrigger "è in uso (sigillato), non può essere modificato"? E qual è il metodo corretto per realizzare ciò che sto cercando di fare qui? (Preferibilmente sto ancora utilizzando un trigger di dati e non un convertitore, poiché devo passare da due valori).


Il valore locale assegnato alla proprietà Text di TextBlock ha una precedenza maggiore rispetto al valore fornito dal Setter in DataTrigger. Vedere Precedenza del valore della proprietà di dipendenza per i dettagli.

Imposta il valore di testo iniziale con un altro 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>

Il messaggio di errore visualizzato quando si utilizza la risorsa booleana è solo il designer XAML che si lamenta. Non ci sono errori in fase di esecuzione.





datatrigger