Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DataTrigger不更改文本属性_C#_Wpf_Xaml_Datatrigger - Fatal编程技术网

C# DataTrigger不更改文本属性

C# DataTrigger不更改文本属性,c#,wpf,xaml,datatrigger,C#,Wpf,Xaml,Datatrigger,我正在尝试对样式使用数据触发器来更改属性 按照“”的要求 要复制,首先在VisualStudio中创建一个WPF应用程序 在App.xaml.cs中: using System.ComponentModel; using System.Windows; namespace Foo{ /// <summary> /// Interaction logic for App.xaml /// </summary> public partial class App : Appl

我正在尝试对样式使用数据触发器来更改属性

按照“”的要求

要复制,首先在VisualStudio中创建一个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;
    }
}
使用System.ComponentModel;
使用System.Windows;
名称空间Foo{
/// 
///App.xaml的交互逻辑
/// 
公共部分类应用程序:应用程序,INotifyPropertyChanged{
私人厕所;
公共图书馆{
获取{返回此。\u单击;}
设置{
这个。_单击=值;
此.PropertyChanged?.Invoke(
这是新的属性ChangedEventArgs(“单击”);
}
}
公共事件属性更改事件处理程序属性更改;
}
}
在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>

真的
在main window.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;
        }
    }
}
使用System.Windows;
名称空间Foo{
/// 
///MainWindow.xaml的交互逻辑
/// 
公共部分类主窗口:窗口{
公共主窗口(){
初始化组件();
}
私有无效按钮\u单击(对象发送者,路由目标e){
(Application.Current as App)。单击=!(Application.Current as App)。单击;
}
}
}
作为旁注-我尝试将数据触发器的值设置为刚好
“True”
,但这也不起作用(触发器没有捕获,文本也没有根据将属性设置为新值而更改)

那么,为什么数据触发器不能在这里捕获或工作呢?(使用静态资源或文本值)?更重要的是——为什么我会犯这个错误?“在使用‘DataTrigger’后(密封),无法修改”错误?完成我在这里所要做的事情的正确方法是什么?(最好仍然使用数据触发器而不是转换器,因为我确实需要在两个值之间切换)。

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

由另一个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设计器。运行时没有错误。

因此,由文字(而不是绑定)设置的值将取代由setter(或数据触发器setter)设置的值并使其无效,这就是导致我的错误的原因。确切地说,有关详细信息,请参阅链接的MSDN文章。谢谢。我现在没有时间考试,但我明天会,如果考试成功,我会给你的答案打上正确的分数。