我正在使用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进行了更改,但无法正常工作。
在这种情况下,我需要更改背景颜色(基于所选的值(编译时间)。
答案 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 成员,则必须遵循以下两个选项之一:
"{Binding Source={x:Static namespace:StaticClass.StaticMember}}"
请注意,在这种情况下,两个类及其成员都定义为静态。
1.1。 Clemens指出,在WPF 4.5中,语法可以简化为"{Binding Path=(namespace:StaticClass.StaticMember)}"
具有定义为<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>
如果您只需要一次性(编译时)绑定,请选择第一个选项,否则第二个选项将为您提供更大的灵活性。