从Xaml运行异步方法

时间:2016-10-25 08:52:24

标签: c# wpf xaml mvvm prism

如何从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(){...}

3 个答案:

答案 0 :(得分:3)

MVVM的重点是将UI与处理分开。

将按钮的Command属性绑定到ViewModel中的ICommand(RelayCommand或其他实现)项。可以async方式调用此命令的关联方法。 E.g。

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));
}

答案 1 :(得分:1)

XAML不应该运行任何东西,它应该只通知视图模型需要运行的东西,一种方法是将事件连接到on click事件,然而另一种可能更好的方法是使用CommandBinding < / p>

Button有一个Command属性,如果你有一个代码对象,则实现ICommand然后你可以使用命令binding来触发动作

例如

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的视图模型都将被连接,而后面没有代码

答案 2 :(得分:0)

  

只需重写您的方法,如下所示:

public void Saving() 
{
    Task.Run(async () => {...});
}