gpt4 book ai didi

WPF MVVM : View's ListBox with source deep in Model. 如何实现?

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

我是 WPF 的新手。我需要将 UI 的 ListBox 绑定(bind)到模型层深处的源。

应用方案如下图所示。描述:

我的 MainWindowViewModel类有 Scheduler属性(Scheduler 模型层中的类)。
Scheduler类有 CurrentParser属性(模型层中的 Parser 类)。
Parser类有 Result字段(ParserResultMetaData 模型层中的类)。
ParserResultMetaData类有 Log字段( LogList(Of String) )

日志只能从模型层以编程方式更改(解析器在其工作期间添加行)。

所以我的问题是如何将我的 ListBox 绑定(bind)到这个 List 以匹配 MVVM 模式。
正如我现在所知道的,ViewModel 必须有一个 ObservableCollection(Of String) 女巫是我的 List(Of String) 来自模型层的副本。

enter image description here

最佳答案

当一行添加到集合中时,您需要以某种方式通知 UI。有多种方法可以实现这一点,但如果从模型层内修改集合,则需要一种机制以一种或另一种方式将其传达给其他层。

  • 在模型层中使用 ObservableCollection。

  • 而像 ObservableCollection 这样的类型和 INotifyPropertyChanged在 MVVM 架构中被广泛使用,它们并不特定于它们,在某些情况下,直接在模型层中使用它们是有意义的。使用 ObservableCollection在您的 Parser类是提供这种通知机制的一种方式。然后您可以绑定(bind) ItemsSourceListBoxScheduler.Parser.Result.Log直接,它会相应地更新。
  • 在您的 ViewModel 中创建一个包装器属性。

  • 如果您不想使用 ObservableCollection在您的模型中,您可以通过 ViewModel 中的属性公开列表,例如:
    public IEnumerable<string> ParserLog 
    {
    get { return Scheduler.Parser.Result.Log; }
    }

    然后您需要在添加项目时手动通知 UI,因此您将需要一个事件(或等效的东西)告诉您的 ViewModel 列表已更改并且它需要引发 PropertyChanged ParserLog 的事件属性(property)。在 ViewModel 中添加如下代码:
        this.Scheduler.Parser.ResultUpdated += (s, e) => this.RaisePropertyChanged("ParserLog");

    这将告诉 ListBox 更新 ParserLog 属性中的项目。

    关于WPF MVVM : View's ListBox with source deep in Model. 如何实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26318542/

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