c# - DataTrigger पाठ गुण नहीं बदलता है



wpf xaml (1)

मैं एक संपत्ति को बदलने के लिए एक शैली पर डेटा-ट्रिगर का उपयोग करने का प्रयास कर रहा हूं।

" न्यूनतम, पूर्ण और सत्यापन योग्य उदाहरण " आवश्यकताओं के अनुपालन में ...

पुन: पेश करने के लिए, पहले विजुअल स्टूडियो में WPF एप्लिकेशन बनाएं।

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

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>

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

एक साइड नोट के रूप में - मैंने केवल "True" के लिए डेटा ट्रिगर का मान सेट करने की कोशिश की, और यह भी काम नहीं किया (ट्रिगर पकड़ में नहीं आया, और संपत्ति को नए मूल्य पर सेट करने के आधार पर पाठ नहीं बदला)।

तो क्यों डेटा-ट्रिगर यहाँ पकड़ या काम नहीं कर रहा है? (या तो स्थैतिक संसाधन या शाब्दिक मूल्य के साथ)? और भी अधिक प्रासंगिक - मुझे यह त्रुटि क्यों मिल रही है? "एक 'DataTrigger' के बाद उपयोग में है (सील), इसे संशोधित नहीं किया जा सकता है" त्रुटि? और जो मैं यहाँ करने की कोशिश कर रहा हूँ उसे पूरा करने की उचित विधि क्या है? (अधिमानतः अभी भी डेटा-ट्रिगर का उपयोग करते हुए और एक कनवर्टर नहीं, क्योंकि मुझे दो मूल्यों के बीच स्विच करने की आवश्यकता है)।


TextBlock की टेक्स्ट प्रॉपर्टी को असाइन किया गया स्थानीय मान DataTrigger में 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>

जब आप बूलियन संसाधन का उपयोग करते हैं तो त्रुटि संदेश आपको केवल XAML डिज़ाइनर से शिकायत होती है। रनटाइम में कोई त्रुटि नहीं है।





datatrigger