我有一个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为空?
由于
格里夫
答案 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。