C# WPF中数据网格的动态更新
我正在构建WPF应用程序,它可以从网站下载文章的链接,并将它们显示在网格中 问题摘要: 我遇到的问题是,我在模型中下载的逻辑无法访问ObservableCollection文章(它在我的ViewModel中定义并绑定到DataGrid) 当我下载新文章时,我应该如何访问此集合以更新它(以便data grid不断逐个添加新文章) 详细信息: 下面是我实现MVVM模式的应用程序的概述(为了便于阅读,我删掉了一些不重要的部分): DisplayWindow.xaml 将source绑定到PresenterViewModel.cs,并且ItemSource设置为Articles,这是ObservableCollection(见下文) 我正在考虑的解决方案: 现在,问题是我在Article.cs模型中使用DownloadArticles方法,需要更新Articles ObservableCollection,它是PresenterViewModel的一部分。。。 我该怎么做?DownloadArticles方法在单独的线程中运行下载逻辑 我是否应该将对PresenterViewModel的引用传递给该模型的DownloadArticles方法 这似乎是一种简单的方法,但感觉不太对-我不认为模型应该耦合到ViewModel,在这种情况下,其中一个方法将接受PresenterViewModel对象 另一种选择是直接在PresenterViewModel中下载逻辑,但这感觉也不对,因为我更希望我的ViewModel是轻量级的,不包含任何逻辑 在这种情况下,最好的解决方案是什么?如果您认为我的架构根本上是错误的,请告诉我在这种情况下构建架构的最佳方式 我真的很感谢你的建议 现在,问题是我在Article.cs模型中使用DownloadArticles方法 并且需要更新文章ObservableCollection,这是 PresenterViewModel。。。我该怎么做 您需要做的是将数据访问逻辑分离到另一个层中,并将其作为依赖项注入到ViewModel中。这样,您就不会将任何数据访问逻辑耦合到ViewModel,因为它的任务应该只是向视图公开模型并响应用户输入 假设您的模型如下所示:C# WPF中数据网格的动态更新,c#,wpf,xaml,mvvm,C#,Wpf,Xaml,Mvvm,我正在构建WPF应用程序,它可以从网站下载文章的链接,并将它们显示在网格中 问题摘要: 我遇到的问题是,我在模型中下载的逻辑无法访问ObservableCollection文章(它在我的ViewModel中定义并绑定到DataGrid) 当我下载新文章时,我应该如何访问此集合以更新它(以便data grid不断逐个添加新文章) 详细信息: 下面是我实现MVVM模式的应用程序的概述(为了便于阅读,我删掉了一些不重要的部分): DisplayWindow.xaml 将source绑定到Present
public class Article : INotifyPropertyChanged
{
private string _url;
public string Url
{
get
{
return _url;
}
set
{
_url = value;
PropertyChanged("Url");
}
}
}
所有的数据访问逻辑都进入一个单独的层,我称之为DataService。其工作是访问外部资源并下载文章:
public interface IDataService
{
IList<Article> DownloadArticles();
}
public class DataService : IDataService
{
public IList<Article> DownloadArticles()
{
var articles = new List<Article>();
// you actually download articles here
return articles;
}
}
最后,当用户通过触发DownloadCommand
请求下载文章时,您将此作业委托给您的服务,并等待结果,然后通过ViewModel的ObservableCollection articles
属性向您的视图公开:
// your DownlodArticles command's execute method
public void Execute(object parameter)
{
var articles = _dataService.DownloadArticles();
Articles = new ObservableCollection(articles);
}
public class DataService
{
private static DataService _instance;
public static DataService Instance
{
get
{
if (_instance == null)
{
_instance = new DataService();
}
return _instance;
}
}
public IList<Articles> DownloadArticles()
{
// ...
}
}
public void Execute(object parameter)
{
var articles = _DataService.Instance.DownloadArticles();
Articles = new ObservableCollection(articles);
}
如果出于某种原因您不想使用依赖项注入,您可以将DataService实现为singleton,并从ViewModel调用它:
// your DownlodArticles command's execute method
public void Execute(object parameter)
{
var articles = _dataService.DownloadArticles();
Articles = new ObservableCollection(articles);
}
public class DataService
{
private static DataService _instance;
public static DataService Instance
{
get
{
if (_instance == null)
{
_instance = new DataService();
}
return _instance;
}
}
public IList<Articles> DownloadArticles()
{
// ...
}
}
public void Execute(object parameter)
{
var articles = _DataService.Instance.DownloadArticles();
Articles = new ObservableCollection(articles);
}
现在,问题是我在Article.cs模型中使用DownloadArticles方法
并且需要更新文章ObservableCollection,这是
PresenterViewModel。。。我该怎么做
您需要做的是将数据访问逻辑分离到另一个层中,并将其作为依赖项注入到ViewModel中。这样,您就不会将任何数据访问逻辑耦合到ViewModel,因为它的任务应该只是向视图公开模型并响应用户输入
假设您的模型如下所示:
public class Article : INotifyPropertyChanged
{
private string _url;
public string Url
{
get
{
return _url;
}
set
{
_url = value;
PropertyChanged("Url");
}
}
}
所有的数据访问逻辑都进入一个单独的层,我称之为DataService。其工作是访问外部资源并下载文章:
public interface IDataService
{
IList<Article> DownloadArticles();
}
public class DataService : IDataService
{
public IList<Article> DownloadArticles()
{
var articles = new List<Article>();
// you actually download articles here
return articles;
}
}
最后,当用户通过触发DownloadCommand
请求下载文章时,您将此作业委托给您的服务,并等待结果,然后通过ViewModel的ObservableCollection articles
属性向您的视图公开:
// your DownlodArticles command's execute method
public void Execute(object parameter)
{
var articles = _dataService.DownloadArticles();
Articles = new ObservableCollection(articles);
}
public class DataService
{
private static DataService _instance;
public static DataService Instance
{
get
{
if (_instance == null)
{
_instance = new DataService();
}
return _instance;
}
}
public IList<Articles> DownloadArticles()
{
// ...
}
}
public void Execute(object parameter)
{
var articles = _DataService.Instance.DownloadArticles();
Articles = new ObservableCollection(articles);
}
如果出于某种原因您不想使用依赖项注入,您可以将DataService实现为singleton,并从ViewModel调用它:
// your DownlodArticles command's execute method
public void Execute(object parameter)
{
var articles = _dataService.DownloadArticles();
Articles = new ObservableCollection(articles);
}
public class DataService
{
private static DataService _instance;
public static DataService Instance
{
get
{
if (_instance == null)
{
_instance = new DataService();
}
return _instance;
}
}
public IList<Articles> DownloadArticles()
{
// ...
}
}
public void Execute(object parameter)
{
var articles = _DataService.Instance.DownloadArticles();
Articles = new ObservableCollection(articles);
}
听起来像中间需要一个DLL来处理这个过程。下载程序不应该知道视图模型,反之亦然。可能您应该在模型中设置事件。并在视图模型中订阅。您的
命令应位于VM
中,您的下载程序应位于模型中。您的VM
应该有对您的模型的引用。这样模型和ViewModel之间的通信就没有问题了,MvvM也是这样工作的。XAMIMAX这就是问题所在,我在模型中有下载逻辑,VM尊重模型,然而,模型需要更新VM中的文章集合,而模型对VM一无所知。听起来,中间需要一个DLL来处理这个过程。下载程序不应该知道视图模型,反之亦然。可能您应该在模型中设置事件。并在视图模型中订阅。您的命令应位于VM
中,您的下载程序应位于模型中。您的VM
应该有对您的模型的引用。通过这种方式,模型和ViewModel之间的通信没有问题,MvvM也是这样工作的。XAMIMAX这就是问题所在,我在模型中有下载逻辑,VM尊重模型,但是模型需要更新VM中的文章集合,而模型对VM一无所知。谢谢Alex!两个问题:1)如何将IDataService数据服务发送给PresenterViewModel构造函数?我目前在第节的DisplayWindow.xaml中定义了这个对象。2) 在您的实现中,DataService中的DownloadArticles()只需下载文章并返回它们。。。如果我必须一个接一个地下载它们,并在下载时更新ObservableCollection(而不是等到所有的都下载了),您会如何处理?我应该通过参考t吗