Ich versuche, einen Datentrigger für einen Stil zu verwenden, um eine Eigenschaft zu ändern.DataTrigger mit Wert, der auf eine statische Ressource festgelegt wird, gibt Fehler - "Nachdem ein 'DataTrigger' verwendet wird (versiegelt), kann er nicht geändert werden"
In Übereinstimmung mit den "Minimal, Complete and Verifiable Example" Anforderungen ...
zu reproduzieren, erstellen Sie zuerst 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;
}
}
Im 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>
Innerhalb 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 Neben Hinweis - Ich habe versucht, den Wert des Datentriggers auf "True"
zu setzen, und das hat auch nicht funktioniert (der Auslöser hat keine t catch, und der Text änderte sich nicht, wenn die Eigenschaft auf einen neuen Wert gesetzt wurde).
Warum fängt der Datentrigger hier nicht an oder arbeitet er? (Entweder mit der statischen Ressource oder dem Literalwert)? Noch relevanter - warum bekomme ich diesen Fehler? Der "Nach einem DataTrigger" wird verwendet (versiegelt), kann nicht geändert werden "Fehler? Und was ist die richtige Methode, um das zu erreichen, was ich hier versuche? (Vorzugsweise benutze ich immer noch einen Datentrigger und keinen Konverter, da ich zwischen zwei Werten umschalten muss).
Ein Wert, der durch ein Literal (im Gegensatz zu einer Bindung) gesetzt wird, ersetzt also einen Wert, der von einem Setter (oder einem Auslöser für Datenauslöser) gesetzt wurde, was meinen Fehler verursacht hat. – Will
Genau, siehe den verknüpften MSDN-Artikel für Details. – Clemens
Danke. Ich habe keine Zeit zu testen, aber ich werde morgen und wenn es funktioniert, werde ich Ihre Antwort richtig markieren. – Will