【问题标题】:Correct design for binding data to a XAML control in a view, from the ViewModel从 ViewModel 将数据绑定到视图中的 XAML 控件的正确设计
【发布时间】:2014-12-17 21:13:59
【问题描述】:

就上下文而言,我正在构建一个通用的 Windows 应用商店应用程序。

我刚刚开始学习 C# 和 MVVM 模式,我需要帮助来正确实现绑定。

我已遵循本教程(绑定)并了解它是如何工作的,但是在此示例中,执行绑定的代码存储在视图类中。

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 控件,而不是将 Collection 发送到 View,然后调用 View 中的方法来填充 XAML 控件。

这是正确的做法吗?如果是,应该怎么做,因为我不知道如何将 XAML 控件公开给我的 ViewModel(我认为我不应该这样做,对吧?)。

我知道我可以公开控件来创建 Mainpage 的新实例,但这没用,因为我需要绑定到当前实例。

Mainpage Test = new MainPage();

有人可以帮我解释一下吗?我读了很多书,要么找不到答案,要么不明白!

谢谢,詹姆斯

【问题讨论】:

    标签: c# xaml binding


    【解决方案1】:

    首先,您肯定有正确的想法。

    你想要做的是创建一个 ViewModel object(让它实现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}"/>
    

    【讨论】:

      【解决方案2】:

      另外,如果您不想触摸窗口后面的代码,您可以执行以下操作:

        <Window.Resources>
          <YourNamespace:MainViewModel x:Key="MainViewModel"/>
         </Window.Resources>
         <Grid DataContext="{StaticResource MainViewModel}">
              <ListView x:Name="TermsListView" ItemsSource="{Binding MyTerms}">    
              </ListView>
         </Grid>
      

      如果你想详细了解这个模式我推荐你阅读这篇文章:WPF MVVM step by step (Basics to Advance Level)

      【讨论】:

      • 确保为此添加 YourNamespace 作为 xmlns。声明视图模型的好方法!
      猜你喜欢
      • 2017-08-03
      • 2012-08-15
      • 1970-01-01
      • 1970-01-01
      • 2017-12-14
      • 1970-01-01
      • 2015-03-17
      • 2020-12-24
      • 1970-01-01
      相关资源
      最近更新 更多