【发布时间】:2014-06-26 12:02:30
【问题描述】:
我有一个带有依赖属性的自定义控件,并且绑定到ViewModel 属性只能像OneWayToSource 一样工作。我搞砸了什么?
绑定
<local:MyControl SelectedItem="{Binding SelectedPage}"/>
ViewModel 和控件
public class ViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private ViewModelPageBase _selectedPage;
public ViewModelPageBase SelectedPage
{
get { return _selectedPage; }
set
{
_selectedPage = value;
OnPropertyChanged();
}
}
public void OnPropertyChanged([CallerMemberName] string property = "")
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(property));
}
}
public class MyControl : ContentControl
{
public object SelectedItem
{
get { return (object)GetValue(SelectedItemProperty); }
set
{
// never get here
SetValue(SelectedItemProperty, value);
}
}
public static readonly DependencyProperty SelectedItemProperty = DependencyProperty.Register(
"SelectedItem",
typeof(object),
typeof(MyControl),
new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
}
之前我使用ItemsControl,绑定是双向工作的。现在,使用MyControl,只有当SelectedItem 被更改时,SelectedPage 才会更新。其他方式(在某处设置SelectedPage)不会更新SelectedItem。
想法?
【问题讨论】:
-
什么是 OnPropertyChanged();方法?显示它。
-
它适用于其他属性,但可以肯定。此示例已简化,仅包含相关部分(我希望如此)。
-
据我了解,您是通过堆栈帧获取 PropertyChangedEventArgs 的属性名称的,不是吗?
-
@EugenePodskal,是的,4.5 的东西。我已经尝试像字符串一样指定它,仍然有问题。
-
是的,他完全正确。 Binding 引擎从不设置 CLR 属性,它总是更改基础 DependencyProperty。 Style Setter、Tigger 或 Animation 也是如此。