我有自定义控件与依赖属性和绑定(bind)到 ViewModel
属性只像 OneWayToSource
一样工作。我搞砸了什么?
绑定(bind)
<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
并且绑定(bind)是双向的。现在,对于 MyControl
,只有当 SelectedItem
发生变化时,SelectedPage
才会更新。其他方式(在某处设置 SelectedPage
)不会更新 SelectedItem
。
想法?
最佳答案
我看到你对依赖属性的 setter 的评论:
public object SelectedItem { get { return (object)GetValue(SelectedItemProperty); } set { // never get here SetValue(SelectedItemProperty, value); } }
我想你已经知道了,但如果你不在 Dependency Property 中,setter 永远不会被调用,如果你想通知任何更改,你应该在 FrameworkPropertyMetadata 的第三个参数中添加一个 PropertyChangedCallback
关于c# - 双向绑定(bind)忽略源更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24430030/