依赖属性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),一个矩形和一个多边形,但似乎不起作用。提前感谢您的帮助。

依赖属性WPF的用户控件DataContext/绑定问题

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

相反,在GradientStop的绑定上,您可以使用RelativeSource={RelativeSource AncestorType=Bin}(假设Bin是您的控件)。或者,您可以定义一个模板并使用TemplateBinding。检查一下我不久前写的一个类似问题的答案——它对它的工作原理有更详细的描述。