WPF MVVM - 绑定到AsyncCommand

时间:2015-06-24 15:04:17

标签: wpf mvvm data-binding async-await task-parallel-library

我有一个ListView,它在XAML中绑定到ViewModel中定义的AsyncCommand。为简洁起见,所有示例均已删除。

XAML

<listView ItemSource="{Binding Path=ReportCommand.Execute.Result}" />
<Button Command="{Binding ReportCommand}">Click</Button>

MVVM 在构造函数中:

ReportCommand = new AsyncCommand<List<MyPoco>>(() => LoadReport());

在课堂上:

public IAsyncCommand ReportCommand { get; private set; }

private async Task<List<MyPoco>> LoadReport()
{
    return await _service.GetListOfPocos();
}

(fyi - 这是基于Stephen Cleary的MSDN文章)

好的,到目前为止,一切都很好。

但是,在Window上的另一个控件上,用户执行了需要清除此ListView的内容(例如,他们注销)。我知道如何让我的各种ViewModel在幕后互相交谈,但是如何清除这个&#34;命令&#34;以便ListView绑定的List为空?

由于

格里夫

1 个答案:

答案 0 :(得分:1)

您是否可以将async命令的结果存储在viewmodel中的另一个属性中,并将ListView绑定到该属性?这样可以让您完全控制内容的更改方式和时间。像这样:

public ViewModelConstructor()
{
    ReportCommand = new AsyncCommand(() => LoadReport());
}

public IAsyncCommand ReportCommand { get; private set; }

private async Task LoadReport()
{
    MyPocoList = await _service.GetListOfPocos();
}

public List<MyPoco> MyPocoList
{
    get { ... }
    set { ...; RaisePropertyChanged("MyPocoList"); }
}

并且您的XAML将更改为:

<ListView ItemSource="{Binding MyPocoList}" />
<Button Command="{Binding ReportCommand}">Click</Button>

如果您需要清除列表框,只需设置MyPocoList = null;

即可

我假设您使用此示例在ViewModel中实现了INotifyPropertyChanged。