【问题标题】:Define a field and use it within MainViewModel定义一个字段并在 MainViewModel 中使用它
【发布时间】:2014-08-04 18:41:19
【问题描述】:

在使用 MVVM-light 并开始学习如何使用之前,我在 MainWindow.xaml.cs 中定义了一个字段来保存在同一文件中使用的字符串列表。

// MainWindow.xaml.cs
public static List<string> FieldName = new List<string>();

现在我很困惑使用/编写该字段并在 MainViewModel.cs 中使用它来观察 MVVM 模式的最佳方法是什么?

方式一:MainWindow.xaml.cs中定义字段,并通过调用MainWindow.FieldNameMainViewModel.cs中使用。

方式二:MainViewModel.cs中定义字段,简单使用。 如果这没问题,那么定义字段的最佳方式是什么?

谢谢。

【问题讨论】:

  • 第二个是正确的选项,你只能绑定属性,不能绑定字段。
  • 您不在文件中定义字段/...,而是在类中。
  • 你不能绑定到字段,所以所有这些字段讨论都是没有意义的。您通常会在 ViewModel 中的属性中公开数据,然后直接绑定到 UI 中的元素。这就是 MVVM 的工作原理。为什么要在窗口的代码隐藏中创建内容列表尚不清楚。
  • 如果你没有将它绑定到用户界面,那么你可以只使用一个字段
  • @Alireza - 根据 MVVM,ViewModel 不应该对 View 有任何了解。因此,如果您想在 VM 中使用此字段,请在您的 VM 中定义它,而不是在 View code behind 中。

标签: c# wpf mvvm mvvm-light


【解决方案1】:

MainViewModel 中定义属性(不是字段)并使用它(例如将视图绑定到它)。

【讨论】:

  • 感谢您的回答。昨晚我得到了很好的答案。我不想绑定字段,所以只声明一个字段(不带属性)对我来说就足够了。
【解决方案2】:

我也开始使用 WPF,但首先,我听说在数据绑定中使用字段是不好的(您将在 WPF 中使用很多)。您需要使用属性(最大的优势之一是使用 INotifyPropertyChanged),但我听说将所有字段和数据上下文合并到一个 MainViewModel 中也是一种很好的做法,如下所示:

public class MainViewModel 
{
    MyDataContext datacontext = new MyDataContext();
}

public class MyDataContext
{
    public static List<string> FieldName = new List<string>();
}

(重要提示:这并没有将 FieldName 实现为属性,为了您阅读下面的帖子,我没有实现它,只是为了演示如何将属性和对象封装到一个 DataContext 中)

这可以让您只建立一个 DataContext,同时仍然允许您访问主数据上下文中的其他数据上下文。此外,不要忘记使用 DependencyProperty,或在您的类中使用字段实现 INotifyPropertyChanged,以便在更改时收到通知。

这里是一个简单的属性实现来演示:

private string _MyProperty;

public string MyProperty
{
    get { return _MyProperty;}
    set { _MyProperty = value;}
}

首先,您需要将该字段转换为属性,这里有一篇文章解释说: How to create a property for a List<T>

如果您希望您的更改反映在您的 UI 上,请不要忘记实现 INotifypropertychanged:Implementing INotifyPropertyChanged - does a better way exist?

【讨论】:

  • 这不仅是一个坏主意,甚至根本没有选择,因为它不起作用。数据绑定仅适用于公共属性。 “我也是WPF入门”,也许你现在在StackOverflow上写答案还为时过早。
  • 您无法绑定到字段。时期。它不起作用。
  • 我总是向那些提出问题或写错答案的人学习;因为知识渊博的人会评论他们的答案。谢谢大家。
  • 我试图对您的问题添加评论,但我缺乏这样做的声誉 -.- 我只能评论我自己的问题/答案,感谢您的评论...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-18
  • 1970-01-01
  • 2021-12-05
  • 1970-01-01
  • 1970-01-01
  • 2013-11-07
  • 1970-01-01
相关资源
最近更新 更多