好的,我的问题是我有一个用户控件。在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)));
依赖项属性有一个名为IsActivePropertyChanged的PropertyChangedCallback,如下所示。
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赋值并使用下面的构造函数,我的颜色分配不起作用,但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),但这似乎不起作用。提前感谢您的帮助。
答案 0 :(得分:1)
编写自己的控件时,不应该弄乱控件本身的DataContext
。
相反,在GradientStop
的绑定上,您可以使用RelativeSource={RelativeSource AncestorType=Bin}
(假设Bin是您的控件)。或者您可以定义模板并使用TemplateBinding。检查this answer 我写了一段时间回答类似的问题 - 它有更详细的说明如何运作。