用户控件上的依赖项属性绑定数据发生更改时不更新属性

问题描述:

我见过其他人有这个问题,有时我最好告诉我已经复制了几个修正的变体,但还没有得到它的工作。用户控件上的依赖项属性绑定数据发生更改时不更新属性

我知道我的绑定数据正在发送适当的INotify事件,因为我可以将其他控件绑定到数据(如文本块),并在对象属性发生更改时查看其内容更改,但我的用户控件似乎没有收到事件。

public partial class MappingSelector : UserControl 
{ 
    public Type OutputDriver 
    { 
     get { return (Type)GetValue(OutputDriverProperty); } 
     set { Console.WriteLine(value.ToString()); SetValue(OutputDriverProperty, value); UpdateUI(); } 
    } 

    // Using a DependencyProperty as the backing store for OutPutDriver. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty OutputDriverProperty = 
     DependencyProperty.Register("OutputDriver", typeof(Type), typeof(MappingSelector), new PropertyMetadata(null)); 
    public MappingSelector() 
    { 
     InitializeComponent(); 
     (this.Content as FrameworkElement).DataContext = this; 
     //UpdateUI(); 
    } 
} 

该setter有一个控制台跟踪,永远不会触发,所以我相信,该属性永远不会被设置。

我然后使用绑定到它:

<root:MappingSelector OutputDriver="{Binding LoadedProfile.UsedDriverInterface, ElementName=page, UpdateSourceTrigger=PropertyChanged}"/> 

我知道LoadedProfile.UsedDriverInterface被更新和发送正确的事件,因为我也有这个它工作得很好:

<TextBlock Text="{Binding LoadedProfile.UsedDriverInterface, ElementName=page, UpdateSourceTrigger=PropertyChanged}"/> 

后期编辑: 这工作,但它真的是我需要做的?有没有更好的办法? 将此添加到用户控件构造函数;

 var OutputDriverDPD = DependencyPropertyDescriptor.FromProperty(OutputDriverProperty, typeof(MappingSelector)); 
     OutputDriverDPD.AddValueChanged(this, (sender, args) => 
     { 
      OutputDriver = (Type)GetValue(OutputDriverProperty); 
     }); 

的制定者有不闪光,所以我深信,财产永远不会被设置在控制台跟踪。

这是一个陷阱。你已经定义的属性获得者和设置者为你的便利。 WPF框架不会调用它们,它将直接使用依赖属性。绝对不要在那些吸气和吸气装置上做任何你需要做的事情。

如果您想对属性更改做出反应,请使用您已发现的回调。你的控制台跟踪应该在那里,而不是在setter中。

+0

原因在这里解释:[XAML加载和依赖属性](https://msdn.microsoft.com/en-us/library/bb613563(v = vs.110).aspx) – Clemens

+0

难题,所以使用DP作为我所有事件和条件的“枢纽”,并且只是使用属性来控制绑定? – Wobbles

+0

@Wobbles是的,属性获取/设置仅供您使用,框架将使用DP。 – nvoigt