DataTrigger是否不绑定到全局静态属性?

时间:2018-12-03 07:33:58

标签: c# wpf datatrigger

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

<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进行了更改,但无法正常工作。

在这种情况下,我需要更改背景颜色(基于所选的值(编译时间)。

2 个答案:

答案 0 :(得分:1)

您没有绑定,因为没有在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;
        }
    }
}

答案 1 :(得分:0)

如果要从XAML访问 Global 成员,则必须遵循以下两个选项之一:

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

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

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

您的代码应为:

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>

如果您只需要一次性(编译时)绑定,请选择第一个选项,否则第二个选项将为您提供更大的灵活性。