Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF/MVVM/Model不更新viewmodel 背景: 我的MVVM应用程序中的绑定属性有问题。现在我做了一个小项目来测试这个案例。它只包括窗口、视图模型、模型、BindableObject(InotifyPropertyChanged的抽象类)和命令类。所有类都在同一命名空间中,datacontext在视图中设置,model和vm已InotifyPropertyChanged,视图中的文本绑定到绑定到model属性的vm属性。构造函数设置模型属性,并影响viewmodel和view中的属性 问题: 当我更改模型中的属性时,它不会更改viewmodel和view中的属性_C#_Wpf_Mvvm_Model_Viewmodel - Fatal编程技术网

C# WPF/MVVM/Model不更新viewmodel 背景: 我的MVVM应用程序中的绑定属性有问题。现在我做了一个小项目来测试这个案例。它只包括窗口、视图模型、模型、BindableObject(InotifyPropertyChanged的抽象类)和命令类。所有类都在同一命名空间中,datacontext在视图中设置,model和vm已InotifyPropertyChanged,视图中的文本绑定到绑定到model属性的vm属性。构造函数设置模型属性,并影响viewmodel和view中的属性 问题: 当我更改模型中的属性时,它不会更改viewmodel和view中的属性

C# WPF/MVVM/Model不更新viewmodel 背景: 我的MVVM应用程序中的绑定属性有问题。现在我做了一个小项目来测试这个案例。它只包括窗口、视图模型、模型、BindableObject(InotifyPropertyChanged的抽象类)和命令类。所有类都在同一命名空间中,datacontext在视图中设置,model和vm已InotifyPropertyChanged,视图中的文本绑定到绑定到model属性的vm属性。构造函数设置模型属性,并影响viewmodel和view中的属性 问题: 当我更改模型中的属性时,它不会更改viewmodel和view中的属性,c#,wpf,mvvm,model,viewmodel,C#,Wpf,Mvvm,Model,Viewmodel,以下是BaseModel和命令类: abstract class BindableObject : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; public void OnPropertieChanged ([CallerMemberName]string name = "") { Pro

以下是BaseModel和命令类:

    abstract class BindableObject : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertieChanged ([CallerMemberName]string name = "")
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
        }
    }


    class Command : ICommand
    {
        private Action<object> execute;
        private Func<object, bool> canExecute;

        public Command(Action<object> execute, Func<object, bool> canExecute = null)
        {
            this.execute    = execute;
            this.canExecute = canExecute;
        }

        public event EventHandler CanExecuteChanged
        {
            add     { CommandManager.RequerySuggested += value; }
            remove  { CommandManager.RequerySuggested -= value; }
        }

        public bool CanExecute(object parameter)
        {
            return this.canExecute == null || this.canExecute(parameter);
        }

        public void Execute(object parameter)
        {
            this.execute(parameter);
        }
    }
视图模型:

    class MainVM : BindableObject
    {
        private int myValue;
        public int MyValue { get => myValue; set { myValue = value; OnPropertieChanged(); } }

        public ICommand Command1 { get; set; }

        public MainVM()
        {
            var model = new Model();
            MyValue  = model.ModelValue;
            Command1 = new Command( (obj) => model.ChangeValue() );
        }

    }
视图:


...

问题在于视图模型中的命令正在调用模型实例上的方法,但xaml绑定到视图模型中int(MyValue)类型的单独属性。这就是为什么MyValue在vm构造函数中设置一次,但从未使用命令更新

在视图模型中使模型类的实例成为属性:

        private Model _myModel;

        public Model MyModel
        {
            get
            {
                return _myModel;
            }
            set
            {
                _myModel = value;
                OnPropertieChanged();
            }
        }

        public ICommand Command1 { get; set; }

        public MainVM()
        {
            MyModel = new Model();           
            Command1 = new Command((obj) => MyModel.ChangeValue());
        }

并绑定到xaml中的ModelValue属性

    <StackPanel>
        <TextBlock Text="{Binding MyModel.ModelValue}"/>
        <Button Height="50" Width="100" Command="{Binding Command1}"/>
    </StackPanel>


但是,一般来说,模型类通常不执行逻辑;相反,逻辑要么在服务类中的模型实例上执行,要么在视图模型中的客户端上执行。但这是单独讨论。

谢谢。当我尝试将模型设置为vm变量,而不是属性时,我非常接近。
        private Model _myModel;

        public Model MyModel
        {
            get
            {
                return _myModel;
            }
            set
            {
                _myModel = value;
                OnPropertieChanged();
            }
        }

        public ICommand Command1 { get; set; }

        public MainVM()
        {
            MyModel = new Model();           
            Command1 = new Command((obj) => MyModel.ChangeValue());
        }

    <StackPanel>
        <TextBlock Text="{Binding MyModel.ModelValue}"/>
        <Button Height="50" Width="100" Command="{Binding Command1}"/>
    </StackPanel>