gpt4 book ai didi

wpf - 刷新 MVVM 中的只读(链式)属性

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

我认为这应该很容易,但我似乎无法弄清楚。

从示例 ViewModel 中获取这些属性(ObservableViewModel 实现 INotifyPropertyChanged):

class NameViewModel : ObservableViewModel
{
Boolean mShowFullName = false;
string mFirstName = "Wonko";
string mLastName = "DeSane";
private readonly DelegateCommand mToggleName;

public NameViewModel()
{
mToggleName = new DelegateCommand(() => ShowFullName = !mShowFullName);
}

public ICommand ToggleNameCommand
{
get { return mToggleName; }
}

public Boolean ShowFullName
{
get { return mShowFullName; }
set { SetPropertyValue("ShowFullName", ref mShowFullName, value); }
}

public string Name
{
get { return (mShowFullName ? this.FullName : this.Initials); }
}

public string FullName
{
get { return mFirstName + " " + mLastName; }
}

public string Initials
{
get { return mFirstName.Substring(0, 1) + "." + mLastName.Substring(0, 1) + "."; }
}
}

使用此 ViewModel 的这种 [在此处插入形容词] View 的内容可能如下所示:
<TextBlock x:Name="txtName"
Grid.Row="0"
Text="{Binding Name}" />

<Button x:Name="btnToggleName"
Command="{Binding ToggleNameCommand}"
Content="Toggle Name"
Grid.Row="1" />

我看到的问题是触发 ToggleNameCommand 时。该命令正确更新了 ShowFullName 属性,但 View 中的 Name 绑定(bind)永远不会更新。

我错过了什么?如何强制绑定(bind)更新?我是否需要将 Name 属性实现为 DependencyProperties(因此从 DependencyObject 派生)?对我来说似乎有点重量级,我希望有一个更简单的解决方案。

谢谢,
重量级

最佳答案

需要明确通知Name发生了变化,否则Binding系统无从得知。您可以在设置 ShowFullName 时为属性“Name”调用 NotifyPropertyChanged,或者您可以修改 Name 属性以具有私有(private) setter 并显式更新它(调用 NotifyPropertyChanged 作为 Name 属性 setter 的一部分),而不是让 getter 评估功能。

请注意,您需要对其他两个只读属性执行相同的操作。使它们成为依赖属性也可以,但我更愿意避免这些,除非我正在实现一个将成为绑定(bind)目标的控件。如果您只需要属性更改通知,它们是重量级的。

关于wpf - 刷新 MVVM 中的只读(链式)属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2827629/

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