gpt4 book ai didi

wpf - 对象属性的 RaisePropertyChanged

转载 作者:行者123 更新时间:2023-12-01 23:53:31 25 4
gpt4 key购买 nike

我有一个模型用户:

public class User
{
public string Name { get; set; }
public int Level { get; set; }
}

在 View 中:

<TextBox Text="{Binding NewUser.Name}"/>
<TextBox Text="{Binding NewUser.Level}"/>

和虚拟机中的属性:

public User NewUser
{
get { return _newUser; }
set
{
if (_newUser == value)
return;
_newUser = value;
RaisePropertyChanged("NewUser");
}
}

此代码确实更新了属性:NewUser = new User() { Name = "test", Level = 1 };

此代码不会:NewUser.Name = "test";

我做错了什么?我正在使用 mvvm light。

最佳答案

设置 NewUser.Name 时,不会调用 ViewModel 上的 RaisePropertyChanged,因此不会触发 PropertyChangedEvent

一般来说,您应该有充分的理由直接在 ViewModel 中公开模型类,就像您在此处所做的那样(将 User 模型公开为 ViewModel 中的公共(public)属性)。这基本上违反了 Models 和 ViewModels 之间的关注点分离,而 MVVM 正是为此而设计的。虽然这看起来很学术,但我的经验是,在这里保持干净是非常值得的,因为在大多数现实世界的情况下,ViewModels 往往会随着时间的推移变得更加复杂,并且包含您不希望在模型中拥有的功能(像 INPC 实现,顺便说一句)。

虽然它涉及更多的编码,但您应该在此处实现一个嵌套的 ViewModel。这里有一些代码可以帮助您入门:

public class ParentViewModel : NotifyingObject
{
private UserViewModel _user;

// This is the property to bind to
public UserViewModel User
{
get { return _user; }
private set
{
_user = value;
RaisePropertyChanged(() => User);
}
}

public ParentViewModel()
{
// Wrap the new instance in a ViewModel
var newUser = new User {Name = "Test"};
User = new UserViewModel(newUser);
}
}

这是包装了 User 模型类的额外 ViewModel:

public class UserViewModel : NotifyingObject
{
/// <summary>
/// The model is private here and not exposed to the view
/// </summary>
private readonly User _model;

public string Name
{
get { return _model.Name; }
set
{
_model.Name = value;
RaisePropertyChanged(() => Name);
}
}

public UserViewModel(User model)
{
_model = model;
}
}

这是您的模型类。无需实现 INotifyPropertyChanged

public class User
{
public string Name { get; set; }
}

关于wpf - 对象属性的 RaisePropertyChanged,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25301168/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com