Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF中数据网格的动态更新_C#_Wpf_Xaml_Mvvm - Fatal编程技术网

C# WPF中数据网格的动态更新

C# WPF中数据网格的动态更新,c#,wpf,xaml,mvvm,C#,Wpf,Xaml,Mvvm,我正在构建WPF应用程序,它可以从网站下载文章的链接,并将它们显示在网格中 问题摘要: 我遇到的问题是,我在模型中下载的逻辑无法访问ObservableCollection文章(它在我的ViewModel中定义并绑定到DataGrid) 当我下载新文章时,我应该如何访问此集合以更新它(以便data grid不断逐个添加新文章) 详细信息: 下面是我实现MVVM模式的应用程序的概述(为了便于阅读,我删掉了一些不重要的部分): DisplayWindow.xaml 将source绑定到Present

我正在构建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,因为它的任务应该只是向视图公开模型并响应用户输入

假设您的模型如下所示:

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吗