INotifyPropertyChanged

INotifyPropertyChanged

在 View 模型(下面的 SomeViewModel)中, Data 属性返回 IEnumerable<IData> ,其中两个接口(interface)都没有实现 INotifyPropertyChanged

但是,底层的 Data 字段是 ObservableCollection<ObservableData> 并且两个类都实现了 INotifyPropertyChanged

最后,在 XAML 中,`Data 绑定(bind)到 DataGrid。



我认为此绑定(bind)可能会引入 KB938416 中描述的绑定(bind)内存泄漏,但令我惊讶的是它没有。

当方法 ChangeData 被调用时,我可以看到 DataGrid 被更新并且 OnPropertyChanged 被称为处理程序。

我的问题是:当绑定(bind)数据返回 INotifyPropertyChanged(两者都没有实现 INotifyPropertyChanged)时,WPF 如何知道使用 IEnumerable<IData>??

public interface IData
{
    string Name { get; }
}

// In addition to IData, implements INotifyPropertyChanged
public class ObservableData : IData, INotifyPropertyChanged
{
    private string _name;
    public string Name
    {
        get { return this._name; }
        set
        {
            if (_name == value) { return; }
            _name = value;
            OnPropertyChanged("Name");
        }
    }
    // 'OnPropertyChanged' omitted for brevity
}

// here is some ViewModel
public class SomeViewModel
{
    private ObservableCollection<ObservableData> _data = new ObservableCollection<ObservableData>();

    // In XAML, a DataGrid's ItemsSource is bound to this.
    public IEnumerable<IData> Data { get { return _data; } }

    public void ChangeData()
    {
        // test OC's notification
        _data.Add(new ObservableData {Name = "new" });
        // test ObservableData's notification
        _data[0].Name += " and changed";
    }
}

最佳答案

即使您的 Data 属性返回的类型为 IEnumerable<IData> ,对象本身仍然是 ObservableCollection<ObservableData> 。 WPF 可以只使用 isas 运算符来测试是否有任何特定对象实现 INotifyPropertyChanged ,而不管提供的句柄如何。

IEnumerable<IData> test = Data;
if (test is INotifyPropertyChanged) {
    //This if block enters because test is really ObservableCollection<ObservableData>
    INotifyPropertyChanged test2 = (INotifyPropertyChanged)test;
}

关于c# - 当我绑定(bind)到 IEnumerable 时,WPF 如何知道使用 INotifyPropertyChanged?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31656869/

10-11 23:42