如何将WindowInteropHelper重新因子化为VM方法

本文关键字:VM 方法 新因 WindowInteropHelper | 更新日期: 2023-09-27 18:26:15

我正在使用WPF中的登录提供程序跟踪auth0中的一个示例WPF应用程序,并尝试在我的MVVM项目中使用这些代码。但我不知道如何将button click代码重构为可以在ViewModel中使用的方法。

我把代码切成了一个void方法,在new WindowInteropHelper(this).Handle上得到的错误如下:

"Error  1   The best overloaded method match for 'System.Windows.Interop.WindowInteropHelper.WindowInteropHelper(System.Windows.Window)' has some invalid arguments"
"Error  2   Argument 1: cannot convert from 'MongoDBApp.ViewModels.LoginViewModel' to 'System.Windows.Window'"

我从错误中了解到,代码是特定于窗口的。有人知道我如何将该代码重新考虑为void方法吗?

这是示例中的按钮点击事件:

    private void LoginWithWidget_Click(object sender, RoutedEventArgs e)
    {
        auth0.LoginAsync(new WindowWrapper(new WindowInteropHelper(this).Handle)).ContinueWith(t =>
        {
            if (t.IsFaulted)
                this.textBox1.Text = t.Exception.InnerException.ToString();
            else
                this.textBox1.Text = t.Result.Profile.ToString();
        },
        TaskScheduler.FromCurrentSynchronizationContext());
    }

这是我将代码重构为一个方法,但使用WindowInteropHelper代码时出现错误:

    private void LoginCustomer(object l)
    {
        auth0.LoginAsync(new WindowWrapper(new WindowInteropHelper(this).Handle)).ContinueWith(t =>
        {
            if (t.IsFaulted)
                MessageBox.Show("Login failed!: ", "Not Logged In", MessageBoxButton.OK, MessageBoxImage.Warning);
            else
                MessageBox.Show("Login succesfull!: ", "Logged In", MessageBoxButton.OK, MessageBoxImage.Warning);
        },
       TaskScheduler.FromCurrentSynchronizationContext());
    }

这是API提供商的网站。

如何将WindowInteropHelper重新因子化为VM方法

一种常见的方法是使用ICommand。

创建一个实现ICommand 的类

public class RelayCommand : ICommand 
{
     public RelayCommand(Action<object> execute)
       : this(execute, null)
   {
   }
    public bool CanExecute(object parameter)
    {
    }
    public void Execute(object parameter)
    {
    }
    public event EventHandler CanExecuteChanged;
} 

我不会用你需要的所有样板代码来夸大答案,你可以在这里找到:http://www.codeproject.com/Tips/813345/Basic-MVVM-and-ICommand-Usage-Example

你也可以遵循这个教程,它几乎概括了你想要实现的目标。

然后在你的ViewModel中,你有你的ICommand处理程序:

public class MyViewModel 
{
    public ICommand LoginCommand{get; private set;}
    public MyViewModel
    {
        LoginCommand = new RelayCommand(_ => DoSomething );
    }
    public void DoSomething(object obj)
    {
        MessageBox.Show(obj.ToString());
    }
}

最后,将其绑定到Xaml视图中:

<Button Width="100" Height="100" Content="{Binding LoginCommand}"/>

这就是代码应该如何工作。尽管如此,按照这个例子,它会让你更好地理解。