我已经看到其他人偶尔会遇到这个问题,而且最好我可以说我已经复制了他们修复的几个版本,但还没有让它发挥作用。
我知道我的绑定数据正在发送正确的INotify事件,因为我可以将其他控件绑定到像textblocks这样的数据,并在对象属性更改时查看其内容更改,但我的用户控件似乎根本没有接收到该事件。
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);
});
答案 0 :(得分:2)
setter有一个永远不会触发的控制台跟踪,因此我确信该属性永远不会被设置。
这是一个陷阱。您定义的属性getter和setter是为了您的方便。 WPF框架不会调用它们,它将直接使用依赖属性。永远不要在那些你需要完成的吸气剂和制定者中做任何事情。
如果您想对属性更改做出反应,请使用您已发现的回调。您的控制台跟踪应该在那里,而不是在设置器中。