【问题标题】:C# MVVM How to update viewmodel string from the modelC# MVVM 如何从模型更新视图模型字符串
【发布时间】:2018-08-18 05:56:50
【问题描述】:

我对 c# 中的 mvvm 和 wpf 真的很陌生,并且陷入了一些非常基本的东西。在这个例子中,我使用的是 Fody.PropertyChanged。我有一个基本的视图模型,它包含一个名为 Test 的字符串,该字符串绑定到一个文本块。

 public class Model : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged = (sender, e) => { };

        public string Test { get; set; }
    }

然后,在一个名为 Data 的单独文件和类中,我有一个简单的函数,它增加一个 int 并将其转换为一个字符串。

public class Data
    {
        public static int i = 0;
        public static string IncTest { get; set; }
        public static void Inc()
        {
            i++;
            IncTest = i.ToString();
        }
    }

调用 Inc() 函数时如何更新视图模型中的 Test 变量?例如,当点击一个按钮时

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = new Model();
        Data.Inc();
    }

    private void Increment_Click(object sender, RoutedEventArgs e)
    {
        Data.Inc();
    }

【问题讨论】:

  • Test 应该设置为什么值?是否要将 Model.Test 设置为 Data.IncTest?
  • @Naman 完全正确。每当我调用 Inc() 函数时,我希望将 Model.Test 设置为 Data.IncTest
  • 如果您只需要通过绑定到 Model.Test 在您的 xaml 中反映最新的 IncTest,您可以尝试将测试的 get 更改为此 get { return Data.IncTest; }
  • @Naman 只在第一次运行时生效,调用该函数后,Model.Test 不会更新 UI。

标签: c# wpf mvvm viewmodel fody-propertychanged


【解决方案1】:

在 MVVM 中,模型不更新视图模型,实际上相反,视图模型更新模型属性。

这是一个例子。

型号:

public class Model
{
    public string Test
    {
        get;
        set;
    }
}

查看模型:

public class ViewModel : INotifyPropertyChanged
{
    private Model _model;

    public string Test
    {
        get
        {
            return _model.Test;
        }
        set
        {
            if(string.Equals(value, _model.Test, StringComparison.CurrentCulture))
            {
                return;
            }
            _model.Test = value;
            OnPropertyChanged();
        }
    }

    public ViewModel(Model model)
    {
        _model = model;
    }

}

您的视图将绑定到您的视图模型。

更新:关于您的问题

public class SomeClass
{
    public static void Main(string [] args)
    {
        Model model = new Model();
        ViewModel viewModel = new ViewModel(model);

        //Now setting the viewmodel.Test will update the model property
        viewModel.Test = "This is a test";
    }
}

【讨论】:

  • 从主方法调用函数时如何更新 ViewModel.Test 字符串?还是在视图模型之外?这是我想不通的。
  • 你的类需要创建一个视图模型的实例。完成后,您可以简单地设置属性。
  • 你的意思是这样做?模型模型 = 新模型(); model.Test = "字符串应该改变吗?";但是,这行不通。我应该创建一个全局实例,然后将数据上下文设置为它吗?这行得通吗?
  • 请查看我帖子中的更新以了解我的意思。
猜你喜欢
  • 2018-06-30
  • 2015-06-14
  • 2014-08-04
  • 2020-01-17
  • 1970-01-01
  • 1970-01-01
  • 2017-10-04
  • 1970-01-01
相关资源
最近更新 更多