2017-06-06 2 views
4

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

Antwort

3

Der lokale Wert, der der Text-Eigenschaft TextBlock zugewiesen ist, hat eine höhere Priorität als der vom Setter im DataTrigger bereitgestellte Wert. Einzelheiten finden Sie unter Dependency Property Value Precedence.

den anfänglichen Textwert von einem anderen Setter Set:

<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 angezeigt, wenn Sie die Boolesche Ressource verwenden beschweren nur die XAML-Designer ist. Zur Laufzeit gibt es keinen Fehler.

+0

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

+0

Genau, siehe den verknüpften MSDN-Artikel für Details. – Clemens

+0

Danke. Ich habe keine Zeit zu testen, aber ich werde morgen und wenn es funktioniert, werde ich Ihre Antwort richtig markieren. – Will

Verwandte Themen