[英]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
類型的對象。
將GridControl
的DataContext
或其任何父元素設置為定義了此屬性的類的實例:
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.