with trigger c# wpf xaml datatrigger

c# - with - DataTrigger no cambia la propiedad Text



trigger with condition wpf (1)

Estoy intentando usar un activador de datos en un estilo para cambiar una propiedad.

En cumplimiento de los requisitos de " Ejemplo mínimo, completo y verificable " ...

Para reproducir, primero cree una aplicación WPF en Visual Studio.

Dentro de la 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; } }

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

Dentro de 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; } } }

Como nota al margen: intenté establecer el valor del activador de datos en "True" , y eso tampoco funcionó (el activador no se captó y el texto no cambió en función de establecer la propiedad en un nuevo valor).

Entonces, ¿por qué el disparador de datos no se captura o funciona aquí? (¿Ya sea con el recurso estático o el valor literal)? Aún más relevante: ¿por qué recibo este error? ¿El error "Después de que un ''DataTrigger'' esté en uso (sellado), no se puede modificar"? ¿Y cuál es el método adecuado para lograr lo que estoy tratando de hacer aquí? (Preferiblemente, sigo usando un activador de datos y no un convertidor, ya que necesito cambiar entre dos valores).


El valor local asignado a la propiedad TextBlock''s Text tiene mayor prioridad que el valor proporcionado por el Organizador en el DataTrigger. Consulte Precedencia del valor de la propiedad de dependencia para obtener más información.

Establezca el valor de Texto inicial por otro Organizador:

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

El mensaje de error que ve cuando usa el recurso booleano es solo el diseñador XAML quejándose. No hay error en tiempo de ejecución.