DataTrigger不会更改Text属性

时间:2017-06-06 03:50:31

标签: c# wpf xaml datatrigger

我试图在样式上使用数据触发器来更改属性。

遵守" Minimal, Complete and Verifiable Example"要求...

要重现,首先在Visual Studio中创建一个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",这也没有用(触发器没有捕获,并且文本没有根据将属性设置为a而改变新价值)。

那么为什么数据触发器没有捕获或在这里工作? (使用静态资源或文字值)?更相关 - 为什么我会收到此错误? &#34;在&#39; DataTrigger&#39;之后正在使用(密封),它不能修改&#34;错误?什么是完成我在这里尝试做的正确方法? (最好仍然使用数据触发而不是转换器,因为我需要在两个值之间切换。)

1 个答案:

答案 0 :(得分:4)

分配给TextBlock的Text属性的本地值的优先级高于DataTrigger中Setter提供的值。有关详细信息,请参阅Dependency Property Value Precedence

通过另一个Setter设置初始Text值:

<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设计者抱怨的。运行时没有错误。