使用MVVM的常见误区(1)在ViewModel中和用户交互
缺点,不能进行单元测试
比如,用户在界面点击按钮,实现用户选择一个文件,然后对文件内容进行解析。常见错误如下
1 using Microsoft.Win32; 2 3 namespace View和ViewModel分工 4 { 5 public class MainWindowViewModel 6 { 7 public void ParseFile() 8 { 9 OpenFileDialog openFileDialog = new OpenFileDialog(); 10 if (openFileDialog.ShowDialog() == true) 11 { 12 //解析文件 13 } 14 } 15 } 16 }
和用户交互的部分(OpenFileDialog),应该放在View中。这里可以利用命令参数来传递文件名
1 namespace View和ViewModel分工 2 { 3 public class MainWindowViewModel 4 { 5 public void ParseFile(string fileName) 6 { 7 //解析文件 8 } 9 } 10 }
在View中按钮的单击事件中,进行交互。如果用户取消了操作,利用异常取消命令执行
1 private void Button_Click(object sender, RoutedEventArgs e) 2 { 3 OpenFileDialog openFileDialog = new OpenFileDialog(); 4 if (sender is Button button && openFileDialog.ShowDialog() == true) 5 button.CommandParameter = openFileDialog.FileName; 6 else 7 throw new UserCanceledException(); 8 }
在xaml部分,按钮同时指定Click和Command
<Button Command="{Binding ParseFileCommand}" Click="Button_Click" Content="选择一个文件解析"/>
完整示例在我的Github中