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 成员,您必须遵循以下任一选项:
"{Binding Source={x:Static namespace:StaticClass.StaticMember}}"
请注意,在这种情况下 class 及其成员都定义为静态的。
1.1。 Clemens 指出,在 WPF 4.5 中,语法可以简化为 "{Binding Path=(namespace:StaticClass.StaticMember)}"
像这样定义静态资源:<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>
如果您只需要一次性(编译时)绑定,那么请使用第一个选项,否则第二个选项会给您更大的灵活性。
我正在使用 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 成员,您必须遵循以下任一选项:
"{Binding Source={x:Static namespace:StaticClass.StaticMember}}"
请注意,在这种情况下 class 及其成员都定义为静态的。1.1。 Clemens 指出,在 WPF 4.5 中,语法可以简化为
"{Binding Path=(namespace:StaticClass.StaticMember)}"
像这样定义静态资源:
<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>
如果您只需要一次性(编译时)绑定,那么请使用第一个选项,否则第二个选项会给您更大的灵活性。