首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >WPF :视图的ListBox,其源代码在模型中很深。如何实施?

WPF :视图的ListBox,其源代码在模型中很深。如何实施?
EN

Stack Overflow用户
提问于 2014-10-11 19:39:49
回答 1查看 343关注 0票数 1

我是新来的。我需要将UI的ListBox绑定到模型层深处的源代码。

应用程序计划在下面的图片。经社部:

我的MainWindowViewModel类有一个Scheduler属性(模型层中的Scheduler类)。

Scheduler类具有CurrentParser属性(模型层中的Parser类)。

Parser类有一个Result字段(模型层中的ParserResultMetaData类)。

ParserResultMetaData类有一个Log字段(LogList(Of String))

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

因此,我的问题是如何将我的ListBox绑定到这个列表以匹配MVVM模式。正如我现在所了解的,ViewModel必须有一个来自模型层的ObservableCollection( String),它是我的列表( String)的副本。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-12 07:29:35

在将一行添加到集合时,您需要通知UI。有多种方法可以实现这一点,但是如果集合是从模型层中修改的,那么您需要一种机制来以某种方式将它与其他层进行通信。

  • 在模型层中使用ObservableCollection。

虽然像ObservableCollectionINotifyPropertyChanged这样的类型在MVVM体系结构中被广泛使用,但它们并不是特定于它们的,在某些情况下,直接在模型层中使用它们是有意义的。在您的ObservableCollection类中使用Parser是提供此通知机制的一种方法。然后,您可以将ItemsSourceListBox直接绑定到Scheduler.Parser.Result.Log,并相应地进行更新。

  • 在ViewModel中创建一个包装器属性。

如果不想在模型中使用ObservableCollection,可以通过ViewModel中的属性公开列表,例如:

代码语言:javascript
复制
public IEnumerable<string> ParserLog 
{
    get { return Scheduler.Parser.Result.Log; }
}

然后,需要在添加项时手动通知UI,因此需要一个事件(或类似的事件),该事件告诉ViewModel列表已更改,并且需要引发ParserLog属性的PropertyChanged事件。在ViewModel中添加如下代码:

代码语言:javascript
复制
    this.Scheduler.Parser.ResultUpdated += (s, e) => this.RaisePropertyChanged("ParserLog");

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26318542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档