繁体   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