Wpf 当使用MVVM模式时,如何绑定到应用程序设置并能够编写单元测试?

Wpf 当使用MVVM模式时,如何绑定到应用程序设置并能够编写单元测试?,wpf,unit-testing,binding,mvvm,Wpf,Unit Testing,Binding,Mvvm,我正在尝试开始使用MVVM模式,并且正在努力解决这个问题 我有一个输入字段,在其中输入搜索筛选器的值。我想记住这个值,所以通常我会将它保存在应用程序设置中 输入字段双向绑定到视图中的设置,该设置正常工作,不会在ViewModel中创建任何应用程序依赖项。我认为这对于单元测试很重要 现在我想响应输入字段中的更改并应用过滤器,但绑定是应用程序设置,而不是ViewModel 我怎样才能解决这个问题?我可以将字段“双重绑定”到设置和ViewModel吗?对于这种情况,什么是明智和务实的方法?根据您的具体

我正在尝试开始使用MVVM模式,并且正在努力解决这个问题

我有一个输入字段,在其中输入搜索筛选器的值。我想记住这个值,所以通常我会将它保存在应用程序设置中

输入字段双向绑定到视图中的设置,该设置正常工作,不会在ViewModel中创建任何应用程序依赖项。我认为这对于单元测试很重要

现在我想响应输入字段中的更改并应用过滤器,但绑定是应用程序设置,而不是ViewModel


我怎样才能解决这个问题?我可以将字段“双重绑定”到设置和ViewModel吗?对于这种情况,什么是明智和务实的方法?

根据您的具体设置,有几种简单的方法可以解决这个问题

如果您只有一个用户输入的文本框,并且您以交互方式过滤数据,那么您可以在视图*的代码隐藏中使用事件处理程序。然后可以从该事件处理程序调用viewmodel公开的命令,该命令可以将搜索文本作为其输入,并相应地过滤数据。当然,viewmodel也可以访问您的应用程序设置数据对象,但我更喜欢更直接和声明性的方法,将其作为命令的参数

如果您有文本框,然后通过按钮启动搜索/筛选,那么您可以从按钮绑定到的viewmodel中公开一个命令,作为命令参数,您可以使用元素绑定将文本传递给命令

使用这两种方法中的任何一种,您在viewmodel中的搜索/筛选代码都是可测试的。您通常不会在UI中对代码进行单元测试,因此不需要担心TextChanged处理程序中的代码。我还应该提到,如果您使用的是交互式搜索,那么可能会非常有用,因为它们提供了一种方便的方式来限制对viewmodel的调用


有些人认为自己是纯粹的纯粹主义者,会想到在视图中的代码会颤抖,但是如果它是纯粹的UI /显示相关代码,那么就可以了,你可以通过它的接口调用VIEW模型。

< P>有一些简单的方法来处理这一点,这取决于你的精确设置。 如果您只有一个用户输入的文本框,并且您以交互方式过滤数据,那么您可以在视图*的代码隐藏中使用事件处理程序。然后可以从该事件处理程序调用viewmodel公开的命令,该命令可以将搜索文本作为其输入,并相应地过滤数据。当然,viewmodel也可以访问您的应用程序设置数据对象,但我更喜欢更直接和声明性的方法,将其作为命令的参数

如果您有文本框,然后通过按钮启动搜索/筛选,那么您可以从按钮绑定到的viewmodel中公开一个命令,作为命令参数,您可以使用元素绑定将文本传递给命令

使用这两种方法中的任何一种,您在viewmodel中的搜索/筛选代码都是可测试的。您通常不会在UI中对代码进行单元测试,因此不需要担心TextChanged处理程序中的代码。我还应该提到,如果您使用的是交互式搜索,那么可能会非常有用,因为它们提供了一种方便的方式来限制对viewmodel的调用


有些人认为自己是纯粹的纯粹主义者,会想到代码中的代码而颤抖,但只要是纯粹的UI /显示相关代码,就可以这样做。然后,您可以通过viewmodel的界面调用它。

在我看来,最好在VM上创建dependency属性,并在此DP的属性更改事件中设置应用程序设置。并将默认值从构造函数加载到此属性。你觉得这个怎么样?@slugster-一个问题。如何从TextChanged事件处理程序获取ViewModel?它会是当前数据上下文上的动态绑定吗?@paul-你不需要绑定。DataContext包含viewmodel,viewmodel应该实现一个接口,因此它变得像
((IMyViewModel)DataContext)一样简单视图可以了解viewmodel,但不能反过来。从技术上讲,它甚至不必是您调用的命令,它可以只是一个普通函数,只要确保通过接口执行即可。@RredCat-您不需要dep属性,只需要使用普通字符串属性即可。然后可以通过模型“保存”过滤器/搜索字符串,或者您可以将其输入应用程序设置。我个人认为这种方法并没有那么纯粹,因为对我来说,最后使用的搜索字符串功能是一种UI功能,而不是VM应该负责的。并不是说它真的很重要,你的视图和视图模型之间仍然有一个清晰的分离。在我看来,最好在VM上创建dependency属性,并在此DP的属性更改事件中设置应用程序设置。并将默认值从构造函数加载到此属性。你觉得这个怎么样?@slugster-一个问题。如何从TextChanged事件处理程序获取ViewModel?它会是当前数据上下文上的动态绑定吗?@paul-你不需要绑定。DataContext包含viewmodel,viewmodel应该实现一个接口,因此它变得像
((IMyViewModel)DataContext)一样简单视图可以了解viewmodel,但不能反过来。从技术上讲,它甚至不必是您调用的命令,它可以只是一个普通函数,只要确保您通过一个接口执行即可。@RredCat-您不需要