如何将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提供商的网站。
一种常见的方法是使用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}"/>
这就是代码应该如何工作。尽管如此,按照这个例子,它会让你更好地理解。