簡體   English   中英

從ViewModel正確設計將數據綁定到視圖中的XAML控件的設計

[英]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.

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