依赖属性WPF的用户控件DataContext/绑定问题
本文关键字:DataContext 绑定 问题 控件 用户 属性 WPF 依赖 | 更新日期: 2023-09-27 18:26:16
好的,所以我的问题是我有一个用户控件。在xaml中,我将一些颜色绑定到我创建的颜色属性,如下所示。
<GradientStop x:Name="stop1" Color="{Binding Color1}" Offset="0"/>
<GradientStop x:Name="stop2" Color="{Binding Color2}" Offset="1"/>
在我的代码后面,我有一个DependencyProperty,我已经声明如下。
public static readonly DependencyProperty IsActiveProperty = DependencyProperty.Register("IsActive", typeof(bool), typeof(Bin),
new PropertyMetadata(new PropertyChangedCallback(Bin.IsActivePropertyChanged)));
依赖项属性有一个PropertyChangedCallback,它调用它,称为IsActivePropertyChanged,如下所示。
private static void IsActivePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
Bin b = (Bin)d;
if((bool)e.NewValue)
{
b.Color1 = Color.FromArgb(0xFF, 0x3E, 0x3E, 0x3E);
b.Color2 = Colors.Red;
b.Color3 = Colors.Red;
b.Color4 = Color.FromArgb(0xFF, 0xFF, 0xFF, 0xFF);
}
else
{
b.Color1 = Color.FromArgb(0xFF, 0x3E, 0x3E, 0x3E);
b.Color2 = Color.FromArgb(0xFF, 0x83, 0x83, 0x83);
b.Color3 = Color.FromArgb(0xFF, 0x63, 0x63, 0x63);
b.Color4 = Color.FromArgb(0xFF, 0xFF, 0xFF, 0xFF);
}
}
如果我使用下面的构造函数,构造函数内部的颜色更改会正常工作,但是,我的IsActivePropertyChangedEvent永远不会被激发。我之所以假设是因为构造函数中的DataContext赋值。
public Bin()
{
Color1 = Color.FromArgb(0xFF, 0x3E, 0x3E, 0x3E);
Color2 = Color.FromArgb(0xFF, 0x83, 0x83, 0x83);
Color3 = Color.FromArgb(0xFF, 0x63, 0x63, 0x63);
Color4 = Color.FromArgb(0xFF, 0xFF, 0xFF, 0xFF);
InitializeComponent();
DataContext = this;
}
如果我注释掉DataContext赋值并使用下面的构造函数,我的Color赋值将不起作用,但IsActivePropertyChanged事件会很好地触发。
public Bin()
{
Color1 = Color.FromArgb(0xFF, 0x3E, 0x3E, 0x3E);
Color2 = Color.FromArgb(0xFF, 0x83, 0x83, 0x83);
Color3 = Color.FromArgb(0xFF, 0x63, 0x63, 0x63);
Color4 = Color.FromArgb(0xFF, 0xFF, 0xFF, 0xFF);
InitializeComponent();
//DataContext = this;
}
我的问题是,我如何才能使绑定正确工作,并使我的活动也能启动。我已经尝试设置绑定到XAML中的颜色属性的项的DataContext="{Binding RelativeSource={RelativeSource Self}}"
(而不是在代码后面设置DataContext),一个矩形和一个多边形,但似乎不起作用。提前感谢您的帮助。
在编写自己的控件时,不应该弄乱控件本身的DataContext
。
相反,在GradientStop
的绑定上,您可以使用RelativeSource={RelativeSource AncestorType=Bin}
(假设Bin是您的控件)。或者,您可以定义一个模板并使用TemplateBinding。检查一下我不久前写的一个类似问题的答案——它对它的工作原理有更详细的描述。