使用 MVVM 将窗口句柄传递给 WPF 中的视图模型

Ehs*_*bar 3 c# wpf mvvm

我正在使用需要窗口句柄的外部库。我的应用程序架构是 MVVM,但外部库并不完全适合该架构。我认为视图模型是调用需要窗口句柄的初始化函数的最合适的地方。如何将窗口句柄从我的视图获取到我的视图模型?

Mic*_*ter 5

通常,您的视图模型不应该了解视图的实现细节(例如 HWND)。但是,正如您的问题所示,您正在使用的外部库需要您对其进行初始化,并且您只能在一个地方执行此操作。假设您的视图模型是最适合它的位置(它甚至可能属于模型),您可以执行如下操作。

一旦所有部分可用,此实现就会为您的视图模型提供窗口句柄。请注意,您在上一个问题中提供的视图模型实现需要视图模型的构造函数中的 HWND。您将必须更改视图模型,以便通过显式调用的方法或属性进行初始化。在下面的代码中,我假设您的视图模型中有一个名为 的方法OnWindowHandleAvailable。您当然可以调用该方法Initialize,或者您可以Handle在您显式设置的视图模型上放置一个属性。

public partial class View
{
    public View()
    {
        InitializeComponent();
        this.Loaded += View_Loaded;
        this.DataContextChanged += View_DataContextChanged;
    }

    private void View_Loaded(object sender, RoutedEventArgs e)
    {
        GiveWindowHandleToViewModel();
    }

    private void View_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
    {
        GiveWindowHandleToViewModel();
    }

    private void GiveWindowHandleToViewModel()
    {
        // get view model
        var viewModel = this.DataContext as ViewModel;
        if (viewModel == null)
            return;

        // get window handle
        var windowHandle = this.GetWindowHandle();
        if (windowHandle == IntPtr.Zero)
            return;

        // signal view model
        viewModel.OnWindowHandleAvailable(windowHandle);
    }

    private IntPtr GetWindowHandle()
    {
        // get window
        var window = Window.GetWindow(this);
        if (window == null)
            return IntPtr.Zero;

        // get window handle
        return new WindowInteropHelper(window).Handle;
    }
}
Run Code Online (Sandbox Code Playgroud)