Si usted está decidido a utilizar FolderBrowserDialog, que haría uso de este tipo de diseño.
Primero, cree una DependencyProperty en su Vista para exponer su identificador.
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); }
}
Ahora, cuando sus cargas ventana, se puede recuperar el identificador utilizando las extensiones que se ofrecen en la pregunta se ha vinculado a:
// 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();
}
Por lo tanto, va a enlazar una sola manera de fuente utilizando un " Propiedad WindowHandle ". Así que si su modelo de vista tiene una propiedad WindowHandle, se mantiene al día con la IWin32Handle válida para la vista relacionada:
// 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");
}
}
}
Ésta es una buena solución, porque no estás codificación dura un modelo de vista para ser emparejado con una vista específica. Si usa varias vistas con el mismo modelo de vista, debería funcionar. Si crea una nueva Vista pero no implementa DependencyProperty, solo funcionará con un identificador nulo.
EDIT:
Como nota al margen, han probado que en realidad no proporciona un parámetro IWin32Owner? Para mí, todavía se abre automáticamente como un diálogo modal para la aplicación y bloquea al usuario para que no interactúe con todas las ventanas de la aplicación. ¿Hay algo más que necesite hacer en su lugar?
Todavía tiene que pasar una IWin32Window a la FolderBrowserDialog para que se muestre como un diálogo modal adecuado . Él quiere saber cómo programar un ViewModel para poder recuperar el IWin32Window de su vista actual. –
Sí y ese es el detalle de implementación. Como dije, si implementa la interfaz, la implementación puede hacer lo que quiera. Viewmodel no necesita saber nada. Puede obtener la vista actual por Application.Current.Windows.Where (x => x.IsActive = true) –