c# - 双向绑定(bind)忽略源更改

标签 c# wpf mvvm binding

我有自定义控件与依赖属性和绑定(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

Setters not run on Dependency Properties?

关于c# - 双向绑定(bind)忽略源更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24430030/

相关文章:

mvvm - Kendo UI Hierarchical datagrid - 如何从详细网格编辑器模板 MVVM 访问 Root View 模型

c# - xna 使用鼠标滚轮缩放

c# - 如何在wpf中创建两个动画之间的时间延迟

c# - 试图获得等距阴影长度的公式?

silverlight - MVVM:在(Silverlight)中管理与 TreeView 的多对多关系

java - 数据绑定(bind)上的空对象引用

c# - MVVM 添加排序说明

c# - 在字符串中动态插入换行符

c# - 使用可移植类库 (PCL) 从 URL 下载字符串

带有上下文菜单的 WPF 按钮