[英]Correct design for binding data to a XAML control in a view, from the ViewModel
就上下文而言,我正在構建通用的Windows Store應用程序。
我剛剛開始學習C#和MVVM模式,我需要正確實現綁定的幫助。
我已經閱讀了本教程(綁定)並了解了它的工作原理,但是在此示例中,進行綁定的代碼存儲在View類中。
public partial class MainPage : Page
{
public ObservableCollection<TermTest> MyTerms = new ObservableCollection<TermTest>();
public MainPage()
{
this.InitializeComponent();
MyTerms.Add(new TermTest("BNC", "Wire"));
MyTerms.Add(new TermTest("Lens", "Collects light"));
this.DataContext = new CollectionViewSource { Source = MyTerms };
}
據我了解,這是糟糕的設計。 在我的實現中,我將使用我的模型檢索將放入Observable集合中的數據。 然后,在我的ViewModel中,我想將ObservableCollection綁定到正在使用它的XAML控件,而不是將Collection發送到View,然后在View中調用一個方法來填充XAML控件。
那是這樣做的正確方法嗎,如果是這樣,應該怎么做,因為我不知道如何向我的ViewModel公開XAML控件(而且我不應該這樣吧)。
我知道我可以公開創建Mainpage的新實例的控件,但這沒用,因為我需要綁定到當前實例。
Mainpage Test = new MainPage();
有人可以幫我解釋一下嗎?-我已經看了很多書,卻找不到答案或聽不懂!
謝謝,詹姆斯
首先,您肯定有正確的想法。
您想要做的是創建一個ViewModel 對象 (已實現INotifyPropertyChanged
),如下所示:
public class MainViewModel : INotifyPropertyChanged
{
//INPC implementation
public ObservableCollection<TermTest> MyTerms
{
//Standard INPC property stuff
}
}
請注意,我使用了一個屬性。 您只能綁定到屬性,並且需要set方法引發PropertyChanged
事件。
然后,為視圖設置數據上下文。 您可以通過多種方法來執行此操作,但是最簡單的方法是:
public MainView() //Default Constructor
{
InitializeComponent();
DataContext = new MainViewModel();
}
最后,綁定!
<ListView ItemsSource="{Binding MyTerms}"/>
另外,如果您不想觸摸窗口后面的代碼,則可以執行以下操作:
<Window.Resources>
<YourNamespace:MainViewModel x:Key="MainViewModel"/>
</Window.Resources>
<Grid DataContext="{StaticResource MainViewModel}">
<ListView x:Name="TermsListView" ItemsSource="{Binding MyTerms}">
</ListView>
</Grid>
如果您想詳細了解此模式,建議您閱讀本文: WPF MVVM逐步指南(從基礎到高級)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.