DataTrigger 未绑定到全局静态 属性?

DataTrigger is not binding to a global static property?

我正在使用 DataTrigger 更改 WPF 中的背景颜色。我在 Globals Class 中有一个 属性,它有一个 true 和 false 值。我从 Whosebug 检查了很多代码,但我没有让它工作。请检查。

<Grid Height="350" Width="525" Name="gridTesting">
        <Grid.Style>
            <Style TargetType="{x:Type Grid}">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding ElementName=Background, Path=IsFB}" Value="True">
                        <Setter Property="Background" Value="Red"/>
                    </DataTrigger>

                    <DataTrigger Binding="{Binding ElementName=Background, Path=IsFB}" Value="False">
                        <Setter Property="Background" Value="Blue"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Grid.Style>
    </Grid>

 public static bool IsFB = true;

我已经在我的代码隐藏 C# 文件中手动设置了变量。知道为什么 运行 失败了。我更改了 属性 并对 DataTrigger 进行了更改但不起作用。

我需要在这种情况下更改背景颜色(根据选择的值(编译时间)。

您没有绑定,因为没有在 MainWindow.xaml.cs

中定义您的 DataContext

使用下面的代码就可以了

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WPFDataTriggers
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window, INotifyPropertyChanged
    {
        private bool isFB = true;
        public bool IsFB
        {
            get { return isFB; }
            set
            {
                isFB = value;
                this.NotifyPropertyChanged("IsFB");
            }
        }
        public event PropertyChangedEventHandler PropertyChanged;

        public void NotifyPropertyChanged(string nomPropriete)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(nomPropriete));
        }

        private bool NotifyPropertyChanged<T>(ref T variable, T valeur, [CallerMemberName] string nomPropriete = null)
        {
            if (object.Equals(variable, valeur)) return false;

            variable = valeur;
            NotifyPropertyChanged(nomPropriete);
            return true;
        }
        public MainWindow()
        {
            InitializeComponent();
            IsFB = true;
            this.DataContext = this;
        }
    }
}

如果您想从 XAML 访问 Global 成员,您必须遵循以下任一选项:

  1. "{Binding Source={x:Static namespace:StaticClass.StaticMember}}" 请注意,在这种情况下 class 及其成员都定义为静态的。

    1.1。 Clemens 指出,在 WPF 4.5 中,语法可以简化为 "{Binding Path=(namespace:StaticClass.StaticMember)}"

  2. 像这样定义静态资源:<namespace:Class x:Key="myKey"/> 然后像这样使用它:"{Binding Source={StaticResource myKey}, Path=MyProperty}" 注意在这种情况下 class 也没有将 属性 定义为静态。

您的代码将是:

public static class Globals
{
    public static bool IsFB = true;
}
<DataTrigger Binding="{Binding Source={x:Static vm:Globals.IsFB}}" Value="True">
    <Setter Property="Background" Value="Red"/>
</DataTrigger>

public class Globals
{
    public bool IsFB { get; set; } = true;
}
<Window.Resources>
    <vm:Globals x:Key="myKey"/>
</Window.Resources>
...
<DataTrigger Binding="{Binding Source={StaticResource myKey}, Path=IsFB}" Value="True">
    <Setter Property="Background" Value="Red"/>
</DataTrigger>

如果您只需要一次性(编译时)绑定,那么请使用第一个选项,否则第二个选项会给您更大的灵活性。