Wpf绑定澄清(初学者)

本文关键字:初学者 绑定 Wpf | 更新日期: 2023-09-27 18:24:53

正如标题所示,我是wpf的新手。我一直在使用wpf,因为它是winforms(不管怎么说,这都是有约束力的,没有意义的),当然,直到我尝试了它,却被震撼了。

所以我深入研究了用户控件和依赖属性。我读到过,为了让ui与后台保持同步,你需要使用可观察的集合、notifypropertychanged/changing和你使用的东西的依赖属性。

我的问题是:

假设我有这个dep.道具。对于用户控件(Media.Color类型):

public Color Color
{
    get { return (Color)GetValue(ColorProperty); }
    set { SetValue(ColorProperty, value); }
}

xaml使用它进行绑定,它有效,一切都很好。但是,当它更新时,我想在代码中对它做一些事情。

所以我试着把Console.writeline("fired")放成这样:

public Color Color
{
    get { return (Color)GetValue(ColorProperty); }
    set { 
            Console.WriteLine("Fired"); 
            SetValue(ColorProperty, value); 
        }
}   

没有骰子。有人能告诉我这些东西是怎么工作的吗?我显然错过了一些东西(就在前几天,有人告诉我MouseCapture的事,所以…)。

谢谢你抽出时间。

编辑

http://www.wpftutorial.net/DependencyProperties.html

基本上,它用粗体字写着,

重要提示:不要向这些属性添加任何逻辑,因为它们是仅在从代码设置属性时调用。如果您设置属性,则直接调用SetValue()方法。

如果您使用的是Visual Studio,您可以键入propdp并点击2x选项卡创建依赖项属性。

然后解释为什么以及如何进行。

解决方案

所以,我尝试了@Krishna的建议,但我的用户控件崩溃并烧毁了。

这是我的dep道具。(就像在问这个问题之前一样)。

public static readonly DependencyProperty ColorProperty = DependencyProperty.Register("Color", typeof(Color), typeof(ColorPickerMaster), new PropertyMetadata(default(Color)));

原来问题出在使用(…)新道具元数据(null,OnPropChanged)

使用

public static readonly DependencyProperty ColorProperty = DependencyProperty.Register("Color", typeof(Color), typeof(ColorPickerMaster), new PropertyMetadata(OnColorChanged));
private static void OnColorChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    Console.WriteLine(e.NewValue);
}

取得了漂亮的胜利。

感谢您的时间和回答。

Wpf绑定澄清(初学者)

当涉及到DependencyProperties时,您可以使用属性更改回调来跟踪对属性的更改,如下例所示。然后使用e.NewValue和e.OldValue来编写逻辑。MSDN 上有关DependencyProperty的更多信息

public Color color
        {
            get { return (Color)GetValue(colorProperty); }
            set { SetValue(colorProperty, value); }
        }
        public static readonly DependencyProperty colorProperty =
            DependencyProperty.Register("color", typeof(Color), typeof(YourClass), new PropertyMetadata(null,colorChanged));
        private static void colorChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            YourClass c = d as YourClass;
            if(c!=null)
            {
            }
        }

来自MSDN-XAML加载和依赖属性:

其XAML处理器的当前WPF实现本质上是依赖属性感知的。WPF XAML处理器在加载二进制XAML和处理作为依赖属性的属性时,使用依赖属性的特性系统方法这有效地绕过了属性包装器。实现自定义依赖项属性时,必须考虑到这种行为,并且应避免在属性包装中放置除属性系统方法GetValue和SetValue之外的任何其他代码。

如果你想在setter中添加自定义逻辑,你必须让它成为一个简单的字段(而不是DependecyProperty)来实现INotifyPropertyChanged并绑定到它