具有依赖项属性WPF的用户控件DataContext / Binding问题

时间:2015-12-08 21:24:11

标签: c# wpf xaml

好的,我的问题是我有一个用户控件。在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),但这似乎不起作用。提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

编写自己的控件时,不应该弄乱控件本身的DataContext

相反,在GradientStop的绑定上,您可以使用RelativeSource={RelativeSource AncestorType=Bin}(假设Bin是您的控件)。或者您可以定义模板并使用TemplateBinding。检查this answer 我写了一段时间回答类似的问题 - 它有更详细的说明如何运作。