簡體   English   中英

如何在WPF / MVVC C#中實現動態綁定

[英]How to achieve dynamic binding in WPF/MVVC C#

我對MVVC / wpf比較陌生,主要是使用winforms。

我要完成的是動態數據綁定,而無需在WPF中使用任何代碼。 用戶界面由一個devexpress網格和幾個按鈕組成。 每按一次按鈕將加載一個對象列表,並在網格中顯示對象。 根據所按下的按鈕,列表包含不同的對象類型。 對於此示例,我提供了兩個類:FatCat和FatDog。

在winforms中,該方法有效:

    private void button1_Click(object sender, EventArgs e)
    {
        ((GridView)gridCtrl.MainView).Columns.Clear();
        gridCtrl.DataSource = new BindingSource(itsModel.GetAll<FatDog>(), null);
    }


    private void button2_Click(object sender, EventArgs e)
    {
        ((GridView)gridCtrl.MainView).Columns.Clear();
        gridCtrl.DataSource = new BindingSource(itsModel.GetAll<FatCat>(), null);
    }

我已將網格配置為動態創建列,因此一切正常。 itsModel類型為CatClientModel。

在wpf中,我已將DataContext定義為CatClientModel。

我應該為網格中的ItemsSource使用什么以實現與Winforms解決方案相同的行為?

dxg:GridControl ItemsSource =“ {Binding SomeDynamicList}”

換句話說,上面的代碼中SomeDynamicList應該是什么? 還是我走錯路了?

正如我所說,我使用的是DevExpress wpf網格控件,但問題應該是通用的,並且適用於任何呈現對象列表的控件。

換句話說,上面的代碼中SomeDynamicList應該是什么?

SomeDynamicList應該是ObservableCollection<T>屬性,可以在其中添加要顯示在GridControl中的任何T類型的對象。

GridControlDataContext或其任何父元素設置為定義了此屬性的類的實例:

public class CatClientModel
{
    public ObservableCollection<Animal> SomeDynamicList { get; } = new ObservableCollection<Animal>();
}

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = new CatClientModel();
    }
}

好。 但是,事實是ObservableCollection包含不同的類型。 不幸的是,沒有可繼承的類。 我想綁定到ObservableCollection或ObservableCollection,這取決於按下了哪個按鈕

然后切換DataContext ,或將屬性更改為IEnumerable並在每次單擊按鈕時將其設置為新集合。 這要求您在視圖模型中實現InotifyPropertyChanged接口

private System.Collections.IEnumerable _collection;
public System.Collections.IEnumerable MyProperty
{
    get { return _collection; }
    set { _collection = value; OnPropertyChanged(); }
}

如果要使用XAML定義代碼,則可以針對每個網格定義哪些數據源。 這確實需要MVVM Manager的至少某種方法(棱鏡或mvvmlight)將視圖模型連接到視圖。

因此,如果您采用MVVM模型路線,則模型將包含對每個網格的描述,如下所示:

 public BulkObservableCollection<icd10facet> FacetList
    {
        get { return this._facets; }
        set { SetProperty(ref this._facets, value); }

    }
    public INotifyTaskCompletion<BulkObservableCollection<PetsConvert>> ConceptList
    {
        get { return this._concept; }
        set
        {
            SetProperty(ref this._concept, value);
        }
    }

在代碼的XAML中,網格將以這種方式綁定到由ConceptList定義的網格:

ItemsSource="{Binding ConceptList.Result}" 

這個答案沒有解決如何連接Prism 6.0例如使用視圖模型的問題,但是有關示例,請參見:

https://github.com/PrismLibrary/Prism

其中包含文檔和入門代碼。 請記住,將代碼放在視圖中的代碼后面沒有問題是沒有任何特定原因的,如果對您而言,關注點分離是問題,則首先解決該問題,然后進行重構。

使用此技術,您可以將每個網格綁定到其自己的數據源。 在MVVM空間中,按鈕和其他功能使用命令模型與視圖模型進行通信。

 <Button Content="Load Rule Data" Width="100" Height="40" HorizontalAlignment="Left" Margin="5px" Command="{Binding LoadRuleData }"/>

這需要在ViewModel中為LoadRuleData定義命令委托

    public DelegateCommand LoadRuleData { get; private set; }

然后(通常在構造函數中)將DelegateCommand連接到將要完成工作的方法。

 this.LoadRuleData = new DelegateCommand(this.loadRules);

暫無
暫無

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

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