c# - multitrigger - wpf trigger mouseover



DataTrigger ändert die Texteigenschaft nicht (1)

Der der Text-Eigenschaft von TextBlock zugewiesene lokale Wert hat eine höhere Priorität als der vom Setter im DataTrigger bereitgestellte Wert. Weitere Informationen finden Sie unter Rangfolge der Abhängigkeitseigenschaftswerte .

Legen Sie den anfänglichen Textwert von einem anderen Setter fest:

<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>

Die Fehlermeldung, die angezeigt wird, wenn Sie die Boolesche Ressource verwenden, ist nur eine Beschwerde des XAML-Designers. Zur Laufzeit liegt kein Fehler vor.

Ich versuche, einen Datentrigger für einen Stil zu verwenden, um eine Eigenschaft zu ändern.

In Übereinstimmung mit den Anforderungen " Minimales, vollständiges und überprüfbares Beispiel " ...

Erstellen Sie zum Reproduzieren zunächst eine WPF-Anwendung in Visual Studio.

Innerhalb der 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;
    }
}

Innerhalb des 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>

In der 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;
        }
    }
}

Als Randnotiz: Ich habe versucht, den Wert des Datentriggers auf "True" , und das hat auch nicht funktioniert (der Trigger hat nicht abgefangen und der Text hat sich nicht geändert, da die Eigenschaft auf einen neuen Wert gesetzt wurde).

Warum fängt oder funktioniert der Datentrigger hier nicht? (Entweder mit der statischen Ressource oder dem Literalwert)? Noch relevanter - warum erhalte ich diesen Fehler? Der Fehler "Nachdem ein 'DataTrigger' verwendet (versiegelt) wurde, kann er nicht geändert werden"? Und was ist die richtige Methode, um das zu erreichen, was ich hier versuche? (Am liebsten noch mit einem Datentrigger und nicht mit einem Konverter, da ich zwischen zwei Werten wechseln muss).





datatrigger