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