2013-01-06 56 views
1

我玩弄WPF Usercontrols,并有以下问题:为什么属性初始化/分配的行为更改后属性是DependencyPropertyWPF Usercontrol Property Intitialization

让我简要说明:

考虑了UserControl类此代码:

public partial class myUserControl : UserControl 
{ 
    private string _blabla; 
    public myUserControl() 
    { 
     InitializeComponent(); 
     _blabla = "init"; 
    } 

    //public static DependencyProperty BlaBlaProperty = DependencyProperty.Register(
    // "BlaBla", typeof(string), typeof(UserControlToolTip)); 

    public string BlaBla 
    { 
     get { return _blabla; } 
     set { _blabla = value; } 
    } 
} 

这是UserControl如何在XAML文件初始化:

<loc:myUserControl BlaBla="ddd" x:Name="myUsrCtrlName" /> 

问题我的是那行 set {_blabla = value; }仅在 DependencyProperty声明被注释掉时才被调用(按照此示例)。但是当 DependencyProperty行成为程序的一部分集{_blabla = value; }行不再被系统调用。

有人可以向我解释这种奇怪的行为吗?

非常感谢!

回答

1

依赖项属性的CLR包装器(getter和setter)只能用于调用依赖项属性的GetValueSetValue方法。

例如

public string BlaBla 
{ 
    get { return (string)GetValue(BlaBlaProperty) } 
    set { SetValue(BlaBlaPropert, value); } 
} 

,仅此而已......
这样做的原因是,WPF绑定引擎调用GetValueSetValue直接(例如,而不调用CLR包装)结合时从XAML来完成。

所以你没有看到他们被调用的原因是因为他们真的不是,这正是你不应该添加任何逻辑到CLR获取和设置方法的原因。

编辑
基于OP的评论 - 这里是创建一个回调方法的一个例子,当DependencyProperty变化:

public static DependencyProperty BlaBlaProperty = 
     DependencyProperty.Register("BlaBla", typeof(string), Typeof(UserControlToolTip), 
     new FrameworkPropertyMetadata(null, OnBlachshmaPropertyChanged)); 


private static void OnBlachshmaPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
{ 
     UserControlToolTip owner = d as UserControlToolTip; 

     if (owner != null) 
     { 
      // Place logic here 
     } 
} 
+0

嗨@Blachshma,非常感谢这一点,但在这种情况下怎么办你*拦截* ** GetValue/SetValue **需要一个Dependance属性,你在哪里添加你自己的逻辑来改变值?我现在拦截在获取/设置位置的UserControl的新值的调用,以便根据该值在控件内部采取一些操作。 – pracheta986919

+0

您可以在更改依赖项属性时创建回调方法。添加到我的答案示例 – Blachshma

+1

非常感谢@Blachshma - 这是很好的帮助和建议!我得到了UserControl框架现在可以工作! – pracheta986919