gpt4 book ai didi

wpf - 从嵌套 View 模型的属性更新标签

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

在我解决我的问题/问题之前,这是我的应用程序的基本结构:

在我的 MainWindow.xaml(本例中的主视图)中,我有一个标签(我意识到我应该将其更改为 TextBlock,但这是一个单独的问题):

<Label Name="StatusLabel" Content="{Binding Path=Status}"/>

它对应的 ViewModel (MainWindowViewModel) 包含另一个 ViewModel (SiteListViewModel) 和一个 Status 属性:

public class MainWindowViewModel : ViewModelBase
{
public SiteListViewModel SiteList { get; set; }
public String Status
{
get { return SiteList.Status; }
}
}

如您所见,MainWindowViewModel 的 Status 属性返回 SiteListViewModel 实例的 Status 属性,其定义如下:

public class SiteListViewModel : ViewModelBase
{
private string status;
public String Status
{
get { return this.status; }
set
{
this.status = value;
base.OnPropertyChanged("Status");
}
}
}

SiteListViewModel 的 Status 属性在异步过程中的不同位置更新,以使用户了解正在发生的事情。这是通过简单的赋值调用来完成的,例如:

Status = String.Format(Properties.Resources.SiteListViewModel_Status_LoadingJobs, count + 1, totalSites);

另一个重要的注意事项,MainWindowViewModel 和 SiteListViewModel 都继承自 ViewModelBase,它实现了 INotifyPropertyChanged。

现在对于实际的问题/问题:

标签不更新。

但是,如果我将 View 中的绑定(bind)更改为:
<Label Name="StatusLabel" Content="{Binding Path=SiteList.Status}"/>

它工作正常。这似乎表明我在 MainWindowViewModel 级别缺少一些东西。我可以保持原样,但这会涉及到 subview 模型的结构,这不是我想做的事情。

有人可以指出我做错了什么吗?

最佳答案

当然它不会更新,绑定(bind)系统会监听您在拥有该属性的类型上绑定(bind)到的属性的更改事件,您根本不会触发任何通知。

您可以转发嵌套 VM 的通知:

public MainWindowViewModel
{
SiteList.PropertyChanged += (s,e)
=> if (e.PropertyName == "Status") OnPropertyChanged("Status");
}

在哪里 OnPropertyChanged是一种提高 PropertyChanged的方法;你的虚拟机基类应该有类似的东西。

不过我建议删除该属性,它是多余的,因为您可以通过 SiteList 直接绑定(bind)(该属性也应在其 setter 中触发更改通知)。您还需要将处理程序与旧实例分离,并在 SiteList 时将其重新附加到新实例。更改(也可以在 setter 中完成)。

关于wpf - 从嵌套 View 模型的属性更新标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9166313/

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