簡體   English   中英

如何實現鏈接/代理數據綁定

[英]How to implement chained/proxied databindings

我的mvvm wpf應用程序中存在此問題,我想在其中創建代理/鏈接的數據綁定。

我的ModelViewController看起來像這樣:

public class ListViewModel
{
    public ObservableCollection<Contact> GridData { get; private set; }
    public ObservableCollection<Contact> SelectedEntities { get; private set; }
    public bool IsSingeselect { get { return SelectedEntities.Count == 1; } }
    public bool IsMultiSelect { get { return SelectedEntities.Count > 0; } }
    public ObservableCollection<MenuComandModel> ContextMenuItems { get; private set; }
}

GridDataSelectedEntities綁定到數據網格,並且像GridData按鈕一樣工作。 我正在使用ContextMenuItems集合為datagrids contextmenu創建BarButtonItems ,這很好用。 MenuComandModel類具有Enabled屬性,我想在IsSingeselectIsMultiSelect屬性上IsMultiSelect屬性綁定到BarButtonItems成員IsEnabled 我將如何存檔?

由於您使用的是DevExpress,因此可以使用DevExpress MVVM Framework及其POCO-ViewModels的所有優點:

using DevExpress.Mvvm.POCO;
//...
public class ListViewModel {
    public ObservableCollection<Contact> GridData { get; private set; }

    // mark the SelectedEntities property as virtual to be notified on initializing/replacing
    public virtual ObservableCollection<Contact> SelectedEntities { get; private set; }
    // unsubscribe the CollectionChanged event in changing-callback
    protected void OnSelectedEntitiesChanging() {
        if(SelectedEntities != null)
            SelectedEntities.CollectionChanged -= SelectedEntities_CollectionChanged;
    }
    // subscribe the CollectionChanged event in changed-callback
    protected void OnSelectedEntitiesChanged() {
        if(SelectedEntities != null)
            SelectedEntities.CollectionChanged += SelectedEntities_CollectionChanged;
        UpdateSelectedEntitiesDependencies();
    }
    void UpdateSelectedEntitiesDependencies() {
        // Raise INPC for dependent properties
        this.RaisePropertyChanged(x => x.IsSingeselect);
        this.RaisePropertyChanged(x => x.IsMultiSelect);
        // Raise INPC for dependent properties of child ViewModels
        foreach(var item in ContextMenuItems)
            item.RaisePropertyChanged(x => x.Enabled);
    }
    void SelectedEntities_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) {
        if(e.Action == NotifyCollectionChangedAction.Add || e.Action == NotifyCollectionChangedAction.Remove || e.Action == NotifyCollectionChangedAction.Reset)
            UpdateSelectedEntitiesDependencies();
    }
    public bool IsSingeselect { get { return SelectedEntities.Count == 1; } }
    public bool IsMultiSelect { get { return SelectedEntities.Count > 0; } }
    public ObservableCollection<MenuComandViewModel> ContextMenuItems { get; private set; }
}

public class MenuComandViewModel {
    public bool Enabled {
        get {
            var parentViewModel = this.GetParentViewModel<ListViewModel>();
            return parentViewModel.IsMultiSelect; // Some implementation
        }
    }
}

然后,您可以使用DXBars,DXRibbon和GalleryControl幫助文章中的MVVM支持中介紹的方法將條形項目綁定到ContextMenuItems集合。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM