草庐IT

c# - MVVM: View 导航无法正常工作

我使用BrianNoyes的Pluralsight类(class)“深入了解WPFMVVM”作为我的主要来源,他展示的内容效果非常好。但是,我不想根据在UtilitiesView上单击的按钮切换View,而是希望根据工具栏按钮(构成VS2015扩展包的一部分)切换View,用户可以在其中选择特定实例。UtilitiesView是由包扩展打开的窗口上的用户控件。所以这是UtilitiesView中的xaml:``可以看出,有两个按钮通过绑定(bind)到ChangeViewModelCommand并传递一个字符串值(“CalculationEngine”或“TAEngine”)来切换Vi

c# - 在 Silverlight 和 MVVM 的组合根中保持 DI 容器的使用

我不太清楚如何设计,所以我在Silverlight+MVVM应用程序的组合根中保留对DI容器的引用。我有以下简单的使用场景:有一个主视图(可能是一个项目列表)和一个为单个项目打开编辑View的操作。因此主视图必须在用户执行操作(例如单击某个按钮)时创建并显示编辑View。为此,我有以下代码:publicinterfaceIView{IViewModelViewModel{get;set;}}然后,对于我需要能够创建的每个View,我都有一个抽象工厂,就像这样publicinterfaceISomeViewFactory{IViewCreateView();}此工厂随后被声明为“父”Vi

c# - 为什么没有人使用 INotifyPropertyChanging?

我知道MVVM大量使用INotifyPropertyChanged,但我从未见过INotifyPropertyChanging的任何用法。有什么理由吗?如果我确实想使用它,将它集成到我的MVVM框架中的好方法是什么?我知道您不应该在ViewModel上使用MessageBox,因为这样您就无法对其进行单元测试。那么,如何抛出一个警报,然后继续进行PropertyChange(如果适用)呢? 最佳答案 关于INotifyPropertyChanging需要牢记的一点是您无法阻止更改的发生。这仅允许您记录发生的更改。我在我的框架中使用它

c# - 如何测试使用 BackgroundWorker 加载的 ViewModel?

MVVM的优点之一是ViewModel的可测试性。在我的特定情况下,我有一个VM,它在调用命令时加载一些数据,及其相应的测试:publicclassMyViewModel{publicDelegateCommandLoadDataCommand{get;set;}privateListmyData;publicListMyData{get{returnmyData;}set{myData=value;RaisePropertyChanged(()=>MyData);}}publicMyViewModel(){LoadDataCommand=newDelegateCommand(OnLo

c# - 处理 ViewModel/Model 中的致命异常

我有一个使用M-V-VM方法编写的应用程序。数据访问在模型中完成。如果此处发生fatalerror(例如,与数据源的连接丢失),则抛出Exception。此异常冒泡到ViewModel。但是,因为数据访问的原始触发器是数据绑定(bind),WPF吞下了这个异常(它只在应用程序在调试器下运行时记录在输出窗口中)。我宁愿这个异常保持未处理状态,这样我的应用程序范围内的未处理异常处理程序就可以拾取它、记录它并优雅地退出。我怎样才能做到这一点? 最佳答案 您可以在调度程序上对异常抛出操作进行排队。//Thispropertyisconnec

c# - MVVM : Share data between ViewModels

如何在多个ViewModel之间共享数据?例如,应用程序中有一个名为Project的类。publicclassProject:ModelBase{privatestring_projectName;publicstringProjectName{get{return_projectName;}set{_projectName=value;RaisePropertyChanged(()=>ProjectName);}}}在多个ViewModels应用程序中应该访问ActiveProject。在ViewModel之间共享项目的最佳方式是什么?中介者模式?(消息)静态对象单例模式(如果是怎么

c# - 如何对在 MVVM 中调用异步方法的 DelegateCommand 进行单元测试

我是单元测试MVVM的新手,在我的项目中使用PRISM。我正在对我们当前的项目实现单元测试,但没有幸运地在线找到可以告诉我如何测试调用异步方法的DelegateCommand的资源。这是我的帖子的后续问题-HowtoUnitTestaViewModelwithasyncmethod.关于如何在MVVM中对异步方法进行单元测试,并回答说公共(public)方法可以使用异步TestMethod进行测试。仅当我要测试的方法是公共(public)方法时,此方案才有效。问题是我想测试我的DelegateCommand,因为这是我想在其他类上公开的唯一公开细节,其他所有内容都是私有(private

c# - MVVM 和控件的动态生成

我已经编写了一个使用GUI生成sql查询的工具,我想使用MVVM和WPF重写该工具,每个sql列类型都有不同的控件,如下图所示我添加了一个基于sql列类型的列过滤器控件,并使用代码生成控件,就像我以前在Windows窗体中所做的那样。在MVVM中,我读到View是完全使用XAML编写的,MVVM是否适合我必须添加不同用户的应用程序动态控制堆栈面板?除非双击某些列,否则控件不会存在于View中,这意味着控件在xaml中不可用,也不会被隐藏或折叠。有什么方法可以避免后面代码中的绑定(bind)?我应该为每种列类型创建一个用户控件吗?一般来说,使用mvvm开发具有复杂和动态UI的此类应用程序

c# - 仅允许在 WPF 文本框中输入数字

我想验证用户输入以确保它们是整数。我该怎么做?我想到了使用IDataErrorInfo,这似乎是在WPF中进行验证的“正确”方法。所以我尝试在我的ViewModel中实现它。但问题是我的文本框绑定(bind)到一个整数字段,并且不需要验证int是否为int。我注意到WPF会自动在文本框周围添加一个红色边框以通知用户错误。基础属性不会更改为无效值。但我想通知用户这一点。我该怎么做? 最佳答案 另一种方法是简单地不允许非整数值。以下实现有点糟糕,我想稍后将其抽象化以使其更易于重用,但这是我所做的:在我看来,在后面的代码中(我知道如果你是

c# - 异步加载 ViewModel 中的数据(使用 async 和 await)不使用数据绑定(bind)

我使用默认模板启动了一个手机应用程序,该模板已经定义了一个View模型。我修改了MainViewModel的LoadData()方法以异步调用odata服务。但它不适用于数据绑定(bind)。我已验证调用成功返回但未显示任何结果。LongListSelector的项源绑定(bind)到View模型中的Items属性。这是我对View模型的修改(注意async和await的用法):publicvoidLoadData(){FetchTileViewItems();}privateasyncvoidFetchTileViewItems(){varret=awaitI2ADataServic