运行 来自 Xaml 的异步方法
Run async method from Xaml
如何从 Xaml(点击)中 运行 异步方法,通常我使用这样的方法:
xmlns:ii="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:eii="http://schemas.microsoft.com/expression/2010/interactions"
<Button Height="30" Width="200" Content="Save" >
<ii:Interaction.Triggers>
<ii:EventTrigger EventName="Click">
<eii:CallMethodAction TargetObject="{Binding}" MethodName="Saveing"/>
</ii:EventTrigger>
</ii:Interaction.Triggers>
</Button>
保存方式:
public async Task Saveing(){...}
XAML 不应该 运行 任何东西,它应该只是通知视图模型需要 运行 一些东西,一种方法是将事件连接到点击事件,但是另一种可能更好的方法是使用 CommandBinding
按钮有一个命令属性,如果你有一个实现 ICommand 的代码对象,那么你可以使用命令绑定来触发操作
例子
public interface ISavable
{
void Save();
SaveCommand SaveCommand { get; }
}
public class SaveCommand : ICommand
{
public event EventHandler CanExecuteChanged;
public bool CanExecute(object parameter)
{
return parameter is ISavable;
}
public void Execute(object parameter)
{
Task.Run(()=>((ISavable)parameter).Save());
}
}
XAML:
<Button Command="{Binding SaveCommand}" CommandParameter="{Binding}" />
这样,任何实现 ISavable
的视图模型都将在没有代码隐藏的情况下连接起来
MVVM 的重点是将 UI 与处理分开。
将按钮的 Command
属性 绑定到 ViewModel 中的 ICommand
(RelayCommand 或其他实现)项目。该命令的关联方法可以async
方式调用。例如
public ICommand SaveCommand {get; private set;}
private async Task SaveMethodAsync()
{
await dbService.SaveDataAsync(modelItem).ConfigureAwait(false);
...
}
public ViewModel()
{
SaveCommand = new RelayCommand(async () =>
await SaveMethodAsync().ConfigureAwait(false));
}
Just rewrite your method as below:
public void Saving()
{
Task.Run(async () => {...});
}
如何从 Xaml(点击)中 运行 异步方法,通常我使用这样的方法:
xmlns:ii="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:eii="http://schemas.microsoft.com/expression/2010/interactions"
<Button Height="30" Width="200" Content="Save" >
<ii:Interaction.Triggers>
<ii:EventTrigger EventName="Click">
<eii:CallMethodAction TargetObject="{Binding}" MethodName="Saveing"/>
</ii:EventTrigger>
</ii:Interaction.Triggers>
</Button>
保存方式:
public async Task Saveing(){...}
XAML 不应该 运行 任何东西,它应该只是通知视图模型需要 运行 一些东西,一种方法是将事件连接到点击事件,但是另一种可能更好的方法是使用 CommandBinding
按钮有一个命令属性,如果你有一个实现 ICommand 的代码对象,那么你可以使用命令绑定来触发操作
例子
public interface ISavable
{
void Save();
SaveCommand SaveCommand { get; }
}
public class SaveCommand : ICommand
{
public event EventHandler CanExecuteChanged;
public bool CanExecute(object parameter)
{
return parameter is ISavable;
}
public void Execute(object parameter)
{
Task.Run(()=>((ISavable)parameter).Save());
}
}
XAML:
<Button Command="{Binding SaveCommand}" CommandParameter="{Binding}" />
这样,任何实现 ISavable
的视图模型都将在没有代码隐藏的情况下连接起来
MVVM 的重点是将 UI 与处理分开。
将按钮的 Command
属性 绑定到 ViewModel 中的 ICommand
(RelayCommand 或其他实现)项目。该命令的关联方法可以async
方式调用。例如
public ICommand SaveCommand {get; private set;}
private async Task SaveMethodAsync()
{
await dbService.SaveDataAsync(modelItem).ConfigureAwait(false);
...
}
public ViewModel()
{
SaveCommand = new RelayCommand(async () =>
await SaveMethodAsync().ConfigureAwait(false));
}
Just rewrite your method as below:
public void Saving()
{
Task.Run(async () => {...});
}