gpt4 book ai didi

c# - 将模型的另一个实例分配给 ViewModel

转载 作者:行者123 更新时间:2023-12-03 10:36:14 25 4
gpt4 key购买 nike

我正在尝试实现一个 MVVM UserControl 用于编辑有关单个类实例(例如 Person 类的实例)的信息。我创建了一个 View 、一个 ViewModel 和一个模型。当我的应用程序启动 View 时, View 会自动在其 DataContext 中实例化一个 ViewModel。 ViewModel 使用 Model 类的新实例进行实例化。

现在,当我将不同的 Person 分配给 ViewModel.Source 属性时, View 中的属性不会更新(因为 DataContext 没有更改,而且我没有引发 PropertyChanged 事件。当然,我可以在 ViewModel 的所有属性上引发属性更改事件类时分配一个新的 Person 实例。但这合适吗?没有更好的方法吗?我是否必须为每个 Person 实例创建一个新的 ViewModel,然后将其分配给 View.DataContext?

这大概是 3 个类的样子:

<UserControl x:Class="PersonView" xmlns:vm="clr-namespace:MyNamespace">
<UserControl.Resources>
<vm:PersonViewModel x:Key="viewmodel" />
</UserControl.Resources>
<Grid>
<TextBox x:Name="txLastName" Grid.Row="1" Grid.Column="1" Text="{Binding Path=txLastName}" />
</Grid>
</UserControl>

代码:

public class PersonViewModel : INotifyPropertyChanged
{
private Person _source;

public Person Source
{
get
{
if (_source == null) _source = new Person();
return _source;
}
set
{
_source = value;
//should I now raise property changed on each property?
}
}

public String txLastName
{
get { return Source.LastName; }
set
{
Source.LastName = value;
this.RaisePropertyChanged("txLastName");
}
}
}

public class Person
{
public String LastName { get; set; }
}

最佳答案

如果绑定(bind)是以这种方式构建的,那么是的,当您更改 Source您将需要为依赖它的任何属性发出属性更改通知。注意一个潜在的快捷方式,RaisePropertyChanged(string.Empty)通常被解释为“所有属性都已更改”。

如果 ViewModel 中没有属性的组合(即,所有都是简单的委托(delegate),如示例中所示)并且模型的属性没有改变(或者,如果它们可以改变,则模型实现 INotifyPropertyChanged),那么它可能更简单直接绑定(bind)到模型(例如 {Binding Path=Source.LastName} )。这样,当 Source更改所有依赖于 Source 的绑定(bind)将更新。

关于c# - 将模型的另一个实例分配给 ViewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27217879/

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