Wpf绑定澄清(初学者)

时间:2014-09-29 11:07:06

标签: c# wpf binding dependency-properties

我是wpf的新手,正如标题所暗示的那样。我正在使用wpf,因为它是winforms(无论如何都是有意义的绑定),直到当然,我尝试了它并被吹走了。

所以我正在深入研究用户控件和依赖属性。我读到这一点,为了让ui与引擎盖下的内容保持同步,你需要使用可观察的集合,notifypropertychanged / changing和你使用的东西的依赖属性。

我的问题是:

让我说我有这个dep。支柱。对于用户控件(Media.Color的类型):

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

xaml使用它进行绑定,它有效,一切都很好。但是,当它得到更新时,我想在代码中用它做点什么。

所以我试着像这样放一个Console.writeline(“炒”):

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

没有骰子。有人可以告诉我这些东西是如何工作的吗?我显然错过了一些东西(就在前几天,有人在堆栈上告诉我有关MouseCapture的信息......)。

感谢您的时间。

修改

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

基本上它用大胆的字母说,

  

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

     

如果您使用的是Visual Studio,则可以键入propdp并点击2x tab   创建一个依赖属性。

继续解释为什么以及如何继续。

解决方案

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

这是我的支持。 (就像在问这个问题之前一样)。

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

原来问题是使用了     (...)new Prop.Metadata(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);
}

获得了美好的胜利。

感谢您的时间和答案。

2 个答案:

答案 0 :(得分:1)

来自MSDN - XAML Loading and Dependency Properties

  

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

如果要在setter中添加自定义逻辑,则必须将其设置为一个简单的字段(不是DependecyProperty)工具INotifyPropertyChanged并绑定到它。

答案 1 :(得分:1)

说到DependencyProperties,您可以使用属性更改回调来跟踪属性的更改,如下例所示。然后使用e.NewValue和e.OldValue编写逻辑。有关MSDN

上的DependencyProperties的更多信息
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)
            {

            }
        }