wpf DialogResult如何绑定到viewmodel
时间: 2024-03-15 18:47:08 浏览: 148
Dialog上绑定View
在 WPF 中,DialogResult 是一个 UI 控件的属性,而 ViewModel 是不应该直接与 UI 控件交互的。所以,我们需要使用一些技巧将 DialogResult 属性绑定到 ViewModel。
一种常见的方法是使用事件。在 ViewModel 中,定义一个事件,当需要关闭窗口时,触发此事件。在 View 中,订阅此事件,当事件触发时,设置 DialogResult 属性,从而关闭窗口。
以下是一个示例代码:
ViewModel:
```c#
public class MyViewModel
{
public event EventHandler<bool?> CloseDialog;
private void OnCloseDialog(bool? result)
{
CloseDialog?.Invoke(this, result);
}
private void Save()
{
// Do some save logic
OnCloseDialog(true);
}
private void Cancel()
{
OnCloseDialog(false);
}
}
```
View:
```xml
<Window>
<i:Interaction.Triggers>
<i:EventTrigger EventName="CloseDialog">
<i:InvokeCommandAction Command="{Binding CloseCommand}" CommandParameter="{Binding EventArgs}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</Window>
```
在上面的代码中,我们使用了 Interactivity 库来实现事件触发命令的功能。当 CloseDialog 事件触发时,会执行 CloseCommand 命令,并将 EventArgs 参数传递给命令。
在 ViewModel 中,我们需要实现 CloseCommand 命令,用于处理关闭窗口的逻辑。
```c#
public class MyViewModel
{
public ICommand CloseCommand { get; private set; }
public MyViewModel()
{
CloseCommand = new RelayCommand<object>(Close);
}
private void Close(object parameter)
{
var args = parameter as EventArgs;
var result = args?.Args[0] as bool?;
if (result != null)
{
// Set DialogResult property to close the window
var window = Application.Current.Windows.OfType<Window>().FirstOrDefault(w => w.IsActive);
if (window != null)
{
window.DialogResult = result;
}
}
}
}
```
在 Close 方法中,我们首先获取 CloseCommand 命令的参数,也就是 CloseDialog 事件的参数。然后,我们从参数中获取 DialogResult 属性的值,并将其设置为当前活动窗口的 DialogResult 属性,从而关闭窗口。
需要注意的是,我们在 Close 方法中使用了 Application.Current.Windows 属性来获取当前活动窗口。这是因为 WPF 应用程序中可能有多个窗口,而这个属性可以获取所有打开的窗口集合。
阅读全文