从视图模型将数据绑定到视图中的 XAML 控件的正确设计
本文关键字:视图 控件 XAML 模型 数据绑定 | 更新日期: 2023-09-27 18:34:40
对于上下文,我正在构建一个通用的Windows应用商店应用程序。
我刚刚开始学习 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 };
}
据我了解,这是糟糕的设计。在我的实现中,我将使用我的模型来检索数据,这些数据将被放入可观察集合中。然后,在我的 ViewModel 中,我希望将 ObservableCollection 绑定到使用它的 XAML 控件,而不是将集合发送到视图,然后在视图中调用方法来填充 XAML 控件。
这是执行此操作的正确方法吗?如果是,应该如何执行此操作,因为我不知道如何将 XAML 控件公开给我的 ViewModel(并且认为我不应该这样做,对吧?
我知道我可以公开创建 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 逐步(从基础知识到高级级别(