我是新来的。我需要将UI的ListBox绑定到模型层深处的源代码。
应用程序计划在下面的图片。经社部:
我的MainWindowViewModel类有一个Scheduler属性(模型层中的Scheduler类)。
Scheduler类具有CurrentParser属性(模型层中的Parser类)。
Parser类有一个Result字段(模型层中的ParserResultMetaData类)。
ParserResultMetaData类有一个Log字段(Log是List(Of String))
日志只能从模型层以编程方式更改(Parser在其工作期间添加行)。
因此,我的问题是如何将我的ListBox绑定到这个列表以匹配MVVM模式。正如我现在所了解的,ViewModel必须有一个来自模型层的ObservableCollection( String),它是我的列表( String)的副本。

发布于 2014-10-12 07:29:35
在将一行添加到集合时,您需要通知UI。有多种方法可以实现这一点,但是如果集合是从模型层中修改的,那么您需要一种机制来以某种方式将它与其他层进行通信。
虽然像ObservableCollection和INotifyPropertyChanged这样的类型在MVVM体系结构中被广泛使用,但它们并不是特定于它们的,在某些情况下,直接在模型层中使用它们是有意义的。在您的ObservableCollection类中使用Parser是提供此通知机制的一种方法。然后,您可以将ItemsSource的ListBox直接绑定到Scheduler.Parser.Result.Log,并相应地进行更新。
如果不想在模型中使用ObservableCollection,可以通过ViewModel中的属性公开列表,例如:
public IEnumerable<string> ParserLog
{
get { return Scheduler.Parser.Result.Log; }
}然后,需要在添加项时手动通知UI,因此需要一个事件(或类似的事件),该事件告诉ViewModel列表已更改,并且需要引发ParserLog属性的PropertyChanged事件。在ViewModel中添加如下代码:
this.Scheduler.Parser.ResultUpdated += (s, e) => this.RaisePropertyChanged("ParserLog");这将告诉ListBox更新ParserLog属性中的项。
https://stackoverflow.com/questions/26318542
复制相似问题