如果您决定使用FolderBrowserDialog,我会使用这种设计。
首先,在视图上创建一个DependencyProperty来暴露它的句柄。现在
public static readonly DependencyProperty WindowHandleProperty =
DependencyProperty.Register("WindowHandle", typeof(System.Windows.Forms.IWin32Window), typeof(MainWindow), new PropertyMetadata(null));
// MainWindow.cs
public System.Windows.Forms.IWin32Window WindowHandle
{
get { return (System.Windows.Forms.IWin32Window)GetValue(WindowHandleProperty); }
set { SetValue(WindowHandleProperty, value); }
}
,当你的窗口负载,您可以使用问题提供的扩展检索手柄您链接到:
// MainWindow.cs
void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
var binding = new Binding();
binding.Path = new PropertyPath("WindowHandle");
binding.Mode = BindingMode.OneWayToSource;
SetBinding(WindowHandleProperty, binding);
WindowHandle = this.GetIWin32Window();
}
所以,你是单向使用“绑定源WindowHandle“属性。所以,如果您的视图模型有WindowHandle属性,它会不断更新与相关视图的有效IWin32Handle:
// ViewModel.cs
private System.Windows.Forms.IWin32Window _windowHandle;
public System.Windows.Forms.IWin32Window WindowHandle
{
get
{
return _windowHandle;
}
set
{
if (_windowHandle != value)
{
_windowHandle = value;
RaisePropertyChanged("WindowHandle");
}
}
}
这是一个很好的解决方案,因为你不硬编码一个视图模型中进行配对与一个特定的视图。如果你使用同一个ViewModel使用多个Views,它应该可以工作。如果你创建了一个新的视图,但你没有实现DependencyProperty,它将只用一个空的句柄来操作。
编辑:
作为一个侧面说明,你实际测试只是没有提供IWin32Owner参数?对我而言,它仍然会自动打开,作为应用程序的模式对话框,并阻止用户与应用程序的所有窗口进行交互。有什么你需要它来做呢?
他仍然需要一个IWin32Window传递到的FolderBrowserDialog为它显示为一个适当的模式对话框。他想知道如何对ViewModel进行编程,以便能够检索当前视图的IWin32Window。 –
是的,那是实施细节。就像我说的,如果你实现接口,实现可以做任何想做的事情。 Viewmodel不需要知道任何东西。您可以通过Application.Current.Windows.Where获取当前视图(x => x.IsActive = true) –