GridControl的BindingSource在持有更改实例的属性上

时间:2016-05-19 07:26:26

标签: c# data-binding

我有一个viewmodel对象,我们现在称之为MyVM。它包含一个数据对象列表(让我们说类型为MyData,它有一个List<MyEntry>属性ListOfEntries),名为AllDataObjects并且具有属性{{1将当前选定的数据对象从其列表中返回。

负责更改所选项目的机制可以使用,并将CurrentSelection对象从MyData分配给AllDataObjects属性。

现在我有一个需要CurrentSelection引用GridControl的DevExpress DataBinding。但是,如果我设置它,绑定将始终指向第一个分配的元素,因为当MyVM.CurrentSelection.ListOfEntries获得分配的新CurrentSelection对象实例时,绑定仍然只知道对旧对象的引用。

有没有办法如何将我的网格绑定到这个嵌套属性,而不必重复和重新初始化MyData一遍又一遍地存储在MyData中的同一个{1}}实例?

1 个答案:

答案 0 :(得分:0)

我设法通过让MyVM实现接口INotifyPropertyChanged并让持有我的网格的UserControl听取其PropertyChanged事件来实现此目的。

public class MyVMClass : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(String propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    public List<MyData> AllDataObjects { get; set; }

    private MyData CurrentSelection_ { get; set; }
    public MyData CurrentSelection
    {
        get { return CurrentSelection_; }
        set
        {
            CurrentSelection_ = value;
            OnPropertyChanged(nameof(CurrentSelection));
        }
    }


    public MyVM(List<MyData> allDataObjects)
    {
        AllDataObjects = allDataObjects;
    }
}

并在UserControl的代码中:

    public void Initialize(MyVMClass myVM)
    {
        MyVM = myVM;
        MyVM.PropertyChanged += MyVM_PropertyChanged;
        MyVM_PropertyChanged();
    }

    private void MyVM_PropertyChanged(object sender=null, PropertyChangedEventArgs e=null)
    {
        if (e == null || e.PropertyName == nameof(MyVMClass.CurrentSelection))
        {
            MyBindingSource.DataSource = MyVM.CurrentSelection.ListOfEntries;
        }
    }