【问题标题】:WPF MVVM - how to clear a list when bound to an AsyncCommandWPF MVVM - 绑定到 AsyncCommand 时如何清除列表
【发布时间】:2015-09-10 20:49:02
【问题描述】:

我有一个在 XAML 中绑定到 ViewModel 中定义的 AsyncCommand 的 ListView。为简洁起见,所有示例都被删减了。

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

(仅供参考 - 这是基于 Stephen Cleary 的 MSDN 文章)

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

但是,在 Window 上的另一个控件上,用户执行了一些需要清除此 ListView 的操作(例如,他们注销)。我知道如何让我的各种 ViewModel 在幕后相互交谈,但是如何清除这个“命令”,使 ListView 绑定的 List 为空?

谢谢

格里夫

【问题讨论】:

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


    【解决方案1】:

    您不能将异步命令的结果存储在视图模型的另一个属性中,并将您的 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。

    【讨论】:

    • 这可能就是我要走的路 - 我有各种其他 UI 控件链接到 ReportCommand(例如 ReportCommand.Execution.IsNotCompleted 和 ReportCommand.Execution.ErrorMessage),但我想没有理由绑定到这是.Result。
    • 嗨@DrGriff - 你最终是走这条路,还是你找到了不同的解决方案?只是注意到你没有接受答案;)
    猜你喜欢
    • 2017-08-05
    • 1970-01-01
    • 1970-01-01
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    相关资源
    最近更新 更多