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