gpt4 book ai didi

c# - WPF OpenFileDialog 与 MVVM 模式?

转载 作者:行者123 更新时间:2023-12-03 04:56:12 25 4
gpt4 key购买 nike

我刚刚开始学习 WPF 的 MVVM 模式。我碰壁了:当你需要显示 OpenFileDialog 时你会怎么做?

这是我尝试使用它的示例 UI:

alt text

单击浏览按钮时,会出现 OpenFileDialog应该显示。当用户从OpenFileDialog中选择一个文件时,文件路径应显示在文本框中。

如何使用 MVVM 做到这一点?

更新:如何使用 MVVM 执行此操作并使其可进行单元测试?下面的解决方案不适用于单元测试。

最佳答案

我通常做的是为执行此功能的应用程序服务创建一个接口(interface)。在我的示例中,我假设您正在使用 MVVM Toolkit 或类似的东西(这样我可以获得基本 ViewModel 和 RelayCommand)。

这是一个极其简单的界面示例,用于执行基本 IO 操作,例如 OpenFileDialogOpenFile。我在这里展示了它们,因此您不会认为我建议您使用一种方法创建一个接口(interface)来解决此问题。

public interface IOService
{
string OpenFileDialog(string defaultPath);

//Other similar untestable IO operations
Stream OpenFile(string path);
}

在您的应用程序中,您将提供此服务的默认实现。以下是您如何使用它。

public MyViewModel : ViewModel
{
private string _selectedPath;
public string SelectedPath
{
get { return _selectedPath; }
set { _selectedPath = value; OnPropertyChanged("SelectedPath"); }
}

private RelayCommand _openCommand;
public RelayCommand OpenCommand
{
//You know the drill.
...
}

private IOService _ioService;
public MyViewModel(IOService ioService)
{
_ioService = ioService;
OpenCommand = new RelayCommand(OpenFile);
}

private void OpenFile()
{
SelectedPath = _ioService.OpenFileDialog(@"c:\Where\My\File\Usually\Is.txt");
if(SelectedPath == null)
{
SelectedPath = string.Empty;
}
}
}

所以这非常简单。现在是最后一部分:可测试性。这应该是显而易见的,但我将向您展示如何为此进行一个简单的测试。我使用 Moq 进行 stub ,但您当然可以使用任何您想要的。

[Test]
public void OpenFileCommand_UserSelectsInvalidPath_SelectedPathSetToEmpty()
{
Mock<IOService> ioServiceStub = new Mock<IOService>();

//We use null to indicate invalid path in our implementation
ioServiceStub.Setup(ioServ => ioServ.OpenFileDialog(It.IsAny<string>()))
.Returns(null);

//Setup target and test
MyViewModel target = new MyViewModel(ioServiceStub.Object);
target.OpenCommand.Execute();

Assert.IsEqual(string.Empty, target.SelectedPath);
}

这可能对你有用。

CodePlex 上有一个名为“SystemWrapper”( http://systemwrapper.codeplex.com ) 的库,它可能会让您免于做很多此类事情。看起来 FileDialog 尚不支持,因此您肯定必须为该对话框编写一个界面。

编辑:

我似乎记得你喜欢使用 TypeMock Isolator 作为你的伪造框架。这是使用 Isolator 进行的相同测试:

[Test]
[Isolated]
public void OpenFileCommand_UserSelectsInvalidPath_SelectedPathSetToEmpty()
{
IOService ioServiceStub = Isolate.Fake.Instance<IOService>();

//Setup stub arrangements
Isolate.WhenCalled(() => ioServiceStub.OpenFileDialog("blah"))
.WasCalledWithAnyArguments()
.WillReturn(null);

//Setup target and test
MyViewModel target = new MyViewModel(ioServiceStub);
target.OpenCommand.Execute();

Assert.IsEqual(string.Empty, target.SelectedPath);
}

关于c# - WPF OpenFileDialog 与 MVVM 模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1619505/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com