MVVM Prism WPF - 设置公共属性和 SetProperty

Posted

技术标签:

【中文标题】MVVM Prism WPF - 设置公共属性和 SetProperty【英文标题】:MVVM Prism WPF - Setting a public property and SetProperty 【发布时间】:2015-09-05 01:05:16 【问题描述】:

我是 MVVM 和 Prism 的新手。我有下面的 ViewModel

    using System.Collections.Generic;
using BasicMVVMQuickstart_Desktop.Model;
using Microsoft.Practices.Prism.Mvvm;

namespace BasicMVVMQuickstart_Desktop.ViewModels

    public class QuestionnaireViewModel : BindableBase
    
        private Questionnaire questionnaire;

        public QuestionnaireViewModel()
        
            this.Questionnaire = new Questionnaire();
            this.AllColors = new[]  "Red", "Blue", "Green" ;

        

        public Questionnaire Questionnaire
        
            get  return this.questionnaire; 
            set  
                SetProperty(ref this.questionnaire, value);


            
        

        public IEnumerable<string> AllColors  get; private set; 

    

我正在尝试从另一个视图模型设置问卷调查并使用来自另一个视图模型的设置值更新 WPF UI。但不幸的是,它不起作用。下面是另一个视图模型的代码。我在“private void OnSubmit(object obj)”中设置了属性,但是当我运行应用程序并按下提交时,UI 没有得到更新。现在任何人都需要为这项工作添加什么?如果我设置“this.QuestionnaireViewModel.Questionnaire.Age = 32;”在 "public MainWindowViewModel()" 中,然后 UI 在运行时更新,但 OnSubmit 不起作用。请帮忙。

 using System.Diagnostics;
using System.Text;
using System.Windows.Input;
using BasicMVVMQuickstart_Desktop.Model;
using Microsoft.Practices.Prism.Commands;
using Microsoft.Practices.Prism.Mvvm;
namespace BasicMVVMQuickstart_Desktop.ViewModels

    public class MainWindowViewModel : BindableBase
    
        public MainWindowViewModel()
        
            this.SubmitCommand = new DelegateCommand<object>(this.OnSubmit);
            this.QuestionnaireViewModel = new QuestionnaireViewModel();
            this.ResetCommand = new DelegateCommand(this.OnReset);

        

        public ICommand SubmitCommand  get; private set; 

        public ICommand ResetCommand  get; private set; 

        public QuestionnaireViewModel QuestionnaireViewModel  get; set; 

        private void OnSubmit(object obj)
        
          Debug.WriteLine(this.BuildResultString());
          this.QuestionnaireViewModel.Questionnaire.Age = 32;
        

        private void OnReset()
        
            this.QuestionnaireViewModel.Questionnaire = new Questionnaire();

        

        private string BuildResultString()
        
            StringBuilder builder = new StringBuilder();
            builder.Append("Name: ");
            builder.Append(this.QuestionnaireViewModel.Questionnaire.Name);
            builder.Append("\nAge: ");
            builder.Append(this.QuestionnaireViewModel.Questionnaire.Age);
            builder.Append("\nQuestion 1: ");
            builder.Append(this.QuestionnaireViewModel.Questionnaire.Quest);
            builder.Append("\nQuestion 2: ");
            builder.Append(this.QuestionnaireViewModel.Questionnaire.FavoriteColor);
            return builder.ToString();
        
    

【问题讨论】:

看来您的问题与PRISM无关。使用数据绑定显示相关的 XAML 标记。 【参考方案1】:

当您在代码中更改 Age 属性时:

this.QuestionnaireViewModel.Questionnaire.Age = 32;

您更改了 Questionnaire 的属性,但没有更改 QuestionnaireViewModel 的属性。因此,您需要从 BindableBase 继承您的 Questionnaire 类并为 Age 属性创建类似的代码:

private int _age;
public int Age
    
        get  return _age; 
        set  SetProperty(ref _age, value); 
    

【讨论】:

太好了,这正是我需要做的事情。谢谢。

以上是关于MVVM Prism WPF - 设置公共属性和 SetProperty的主要内容,如果未能解决你的问题,请参考以下文章

使用 Prism 和 MVVM 模式在 WPF 中创建模态对话框的“漂亮”方式

.NET Core 3 WPF MVVM框架 Prism系列之导航系统

六从GitHub浏览Prism示例代码的方式入门WPF下的Prism之MVVM中的FilteringEvents

从PRISM开始学WPFMVVMViewModel?

从PRISM开始学WPFMVVMCommand?

无法使用 PRISM 5、MVVM 和 EF 6 在 WPF 中刷新 DataGrid