Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.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# ViewModels开场白_C#_Mvvm - Fatal编程技术网

C# ViewModels开场白

C# ViewModels开场白,c#,mvvm,C#,Mvvm,ViewModel打开附加对话真的有什么问题吗?假设我有一个主视图和一个主视图模型。MainViewModel是MainView的datacontext,实际上不知道或不依赖于MainView本身 但是,在某些情况下,主视图需要打开会影响ViewModel数据的对话框。例如,我可能希望显示一个对话并显示一些项目,以允许用户从中进行选择。所以,我决定的是: 在我的ViewModel中,我有以下方法:AddItem、EditItem和DeleteItem。但是,为了提供要添加或编辑的项目,我需要在一

ViewModel打开附加对话真的有什么问题吗?假设我有一个主视图和一个主视图模型。MainViewModel是MainView的datacontext,实际上不知道或不依赖于MainView本身

但是,在某些情况下,主视图需要打开会影响ViewModel数据的对话框。例如,我可能希望显示一个对话并显示一些项目,以允许用户从中进行选择。所以,我决定的是:

在我的ViewModel中,我有以下方法:
AddItem
EditItem
DeleteItem
。但是,为了提供要添加或编辑的项目,我需要在一些对话框中提供一个列表供用户选择。现在我让ViewModel这样做只是因为我不想为这样简单的任务实现额外的抽象级别。让ViewModel这样做意味着它可以向用户提供要显示的列表,并且当用户完成编辑或选择时,它可以轻松地更新其成员集合/属性


我应该接受这种方法吗?

我认为ViewModels之间的通信没有任何问题。问题是他们是否开始访问视图或其他对话框,因为这将影响系统的可测试性


如果您真的想要一个更松散耦合的系统,您可以使用某种消息传递系统进行通信,但我怀疑您在这里是否需要:-)

我认为ViewModels之间的通信没有任何问题。问题是他们是否开始访问视图或其他对话框,因为这将影响系统的可测试性


如果您真的想要一个更松散耦合的系统,您可以使用某种消息传递系统进行通信,但我怀疑您是否需要它:-)

Shot?不,但有充分的理由不这样做

首先,它破坏了ViewModel的可测试性,因为现在有了一个可视化组件。当您试图针对它编写自动单元测试时,您仍然需要与它交互。您可以模拟它,但当您调用UI方法时,这样做会变得更加困难

其次,viewmodel不应该关心显示的内容。当你开始组合这些东西时,会有一个真正的“关注分离”问题

第三,它只是有一种“代码气味”

你可以做一些事情来回避这个问题。我建议的第一件事是不要使用对话框。对话框有自己的位置,但程序员往往会过度使用它们。重新思考您的设计,并尝试找出如何在不中断用户的情况下完成工作


第二,考虑使用消息传递框架在VIEW模型和视图之间发送消息,以便对对话框进行导航(如果您绝对要使用它们)。消息很容易模拟和/或编写单元测试。

Shot?不,但有充分的理由不这样做

首先,它破坏了ViewModel的可测试性,因为现在有了一个可视化组件。当您试图针对它编写自动单元测试时,您仍然需要与它交互。您可以模拟它,但当您调用UI方法时,这样做会变得更加困难

其次,viewmodel不应该关心显示的内容。当你开始组合这些东西时,会有一个真正的“关注分离”问题

第三,它只是有一种“代码气味”

你可以做一些事情来回避这个问题。我建议的第一件事是不要使用对话框。对话框有自己的位置,但程序员往往会过度使用它们。重新思考您的设计,并尝试找出如何在不中断用户的情况下完成工作


第二,考虑使用消息传递框架在VIEW模型和视图之间发送消息,以便对对话框进行导航(如果您绝对要使用它们)。消息很容易模拟和/或编写单元测试。

实现这一点的简单方法:使用对话框服务-易于使用,易于单元测试


请参阅。

执行此操作的简单方法:使用对话框服务-易于使用,易于单元测试


请参阅。

我总是使用SeelTor服务(只是一个基本的对话框服务)来实现这一点-它是可测试和可模拟的,并且使代码非常可靠

class ViewModel
{
    public ICommand ShowListSelectorForCounterparties { get; set; }

    public IListSelectorService ListSelector { get; set; }

    public void OnExecuteShowCounterpartySelector()
    {
        this.Counterparty = this.ListSelector.Select<Counterparty>();
    }
}
类视图模型
{
公共ICommand ShowListSelector for交易对手{get;set;}
公共IListSelectorService列表选择器{get;set;}
public void OnExecuteShowCounterpartySelector()
{
this.contractor=this.ListSelector.Select();
}
}

其中,IListSelectorService可以在运行时实例化对话框、显示列表并返回所选项目。以这种方式运行它的主要好处是,您的单元测试可以模拟IListSelectorService。

我总是使用Seelctor服务(只是一个基本的对话框服务)来实现这一点-它是可测试和可模拟的,并使代码非常稳定

class ViewModel
{
    public ICommand ShowListSelectorForCounterparties { get; set; }

    public IListSelectorService ListSelector { get; set; }

    public void OnExecuteShowCounterpartySelector()
    {
        this.Counterparty = this.ListSelector.Select<Counterparty>();
    }
}
类视图模型
{
公共ICommand ShowListSelector for交易对手{get;set;}
公共IListSelectorService列表选择器{get;set;}
public void OnExecuteShowCounterpartySelector()
{
this.contractor=this.ListSelector.Select();
}
}

其中,IListSelectorService可以在运行时实例化对话框、显示列表并返回所选项目。以这种方式运行它的主要好处是,您的单元测试可以模拟IListSelectorService。

我不确定您是否仍在寻求任何帮助,但在对话框方面,我采取的方法是让视图模型引发一个事件,然后视图可以处理该事件。视图现在可以执行任何操作,以将数据获取到视图模型中,因此您可以在视图中显示对话框而不会出现问题。将对话框中的响应传递给事件的EventArgs,以便