在WPF的MVVM模式中,处理对话框是更复杂的操作之一.由于您的视图模型对视图一无所知,因此对话通信很有趣.我可以公开一个ICommand,当视图调用它时,会出现一个对话框.
有没有人知道处理对话结果的好方法?我说的是关于Windows对话框,比如MessageBox.
我们这样做的方法之一是在viewmodel上有一个事件,当需要对话框时,视图会订阅该事件.
public event EventHandler<MyDeleteArgs> RequiresDeleteDialog;
Run Code Online (Sandbox Code Playgroud)
这没关系,但这意味着视图需要代码,这是我想远离的东西.
我刚开始学习WPF的MVVM模式.我碰壁了:当你需要展示一个OpenFileDialog时你会怎么做?
这是我尝试使用它的示例UI:

单击"浏览"按钮时,应显示OpenFileDialog.当用户从OpenFileDialog中选择文件时,文件路径应显示在文本框中.
我怎么能用MVVM做到这一点?
更新:如何使用MVVM实现此功能并使其可以进行单元测试?以下解决方案不适用于单元测试.
我有一个应用程序,需要从用户输入一些信息的按钮打开一个对话框.
目前我这样做(工作正常)
有很多步骤,但它们都有意义,并没有太多的打字.
代码看起来像这样(窗口要求输入用户名)
视图模型:
AskUserNameCommand = DelegateCommand(AskUserNameExecute);
...
public event EventHandler<AskUserEventArgs> AskUserName;
void AskUserNameExecute(object arg) {
var e = new AskUserNameEventArgs();
AskUserName(this, e);
mModel.SetUserName(e.UserName);
}
Run Code Online (Sandbox Code Playgroud)
控制器:
mViewModel.AskUserName += (sender,e) => {
var view = container.Resolve<IAskUserNameView>();
var model = container.Resolve<IAskUserNameModel>();
var viewmodel = container.Resolve<IAskUserNameViewModel>(view, model);
if (dlg.ShowDialog() ?? false)
e.UserName = model.UserName;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是水平通信如何在MVVM模式中工作.不知何故,让控制器参与模型之间的数据传输似乎是错误的.
我已经查看了中介模式,让模型直接进行通信.不喜欢这个想法,因为它使模型取决于GUI的实现细节.(即如果用文本框替换对话框,模型需要更改)
我有一个 ObservableCollection 类型的数据集合(比如 myClassTypes 实例)。在一些用户操作之后,这个 myClassTypes 填充了 ViewModel 中的值。在视图中,有一个文本框,用户可以在其中输入文本。我需要根据 myClassTypes 值验证文本框数据。因此,如果 myClassTypes 包含用户在文本框中插入的文本,则验证通过,否则将失败。我的代码片段是:ViewModel:
public ObservableCollection < MyClassType > ViewModelClassTypes {
get {
return _myClassTypes;
}
set {
_myClassTypes = value;
NotifyOfPropertyChange(() = >MyClassTypes);
}
}
public class TestValidationRule: ValidationRule {
public ObservableCollection < MyClassType > MyClassTypes {
get = >(ObservableCollection < MyClassType > ) GetValue(MyClassTypesProperty);
set = >SetValue(MyClassTypesProperty, value);
}
}
Run Code Online (Sandbox Code Playgroud)
仅供参考:MyClassTypesProperty 是一个依赖属性
我的 View.xaml 是:
<TextBox>
<TextBox.Text>
<Binding UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<validationRules:TestValidationRule MyClassTypes="{Binding ViewModelClassTypes}"/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
Run Code Online (Sandbox Code Playgroud)
我无法在 MyClassTypes …
如何在 c# 中使用 MVVM (Model-View-ViewModel) 编写 WPF OpenFileDialog?我访问了一些关于这个 OpenFileDialog 的网站,但我没有清楚地了解它。这是我的代码
在View.xaml 中:
<Window.... xmlns:VM="clr-namespace:myproject.myViewModel"
... >
<Window.DataContext><VM:myViewModel/>
</Window.DataContext>
<ItemsControl ItemsSource="{Binding mygroup}" >
<ItemsControl.ItemTemplate >
<DataTemplate>
<Grid >....
<TextBlock Text="Color" Margin="20" VerticalAlignment="Center"/>
<ComboBox KeyboardNavigation.TabIndex="0" Grid.Column="1" Margin="45,10,10,10" Height="30" Width="200" ItemsSource="{Binding Color}" />
<TextBlock Text="Shapes" Grid.Row="1" VerticalAlignment="Center" />
<ComboBox KeyboardNavigation.TabIndex="3" Grid.Column="1" Grid.Row="1" Height="20" Width="150" SelectedIndex="0" HorizontalContentAlignment="Right"
VerticalAlignment="Center" ItemsSource="{Binding Shapes}">
</ComboBox>
<TextBlock Text="Open Files " VerticalAlignment="Center" Grid.Row="0" Grid.Column="2" Margin="10" />
<TextBox Grid.Column="3" Text="" Height="30" Grid.Row="0" IsReadOnly="True"
TextAlignment="Right" VerticalContentAlignment="Center" Width="200" /> <Button Grid.Column="4" …Run Code Online (Sandbox Code Playgroud)