【问题标题】:WPF Control Visibility w/ ICommand & OnPropertyChanged带有 ICommand 和 OnPropertyChanged 的​​ WPF 控件可见性
【发布时间】:2013-08-23 18:49:21
【问题描述】:

我有一个带有 3 个控件的用户窗口 - 一个“执行”按钮、一个结果控件和一个处理控件。我的目标是在按下执行后显示处理控件,然后在执行方法完成时将其隐藏。

但是,当我认为处理控件会显示时,它不会显示...相反,它仅在(如果)创建另一个提示用户输入的窗口的回调函数被调用时显示。

处理控件的可见性通过 BoolToVis 转换器绑定到我的视图模型中的 bool Processing。 execute 方法在开始时将Processing 设置为 true,然后在结束时设置为 false。 Processing 的 setter 调用 OnPropertyChanged. 我的视图模型实现了 INotifyPropertyChanged.

    private bool _processing;
    public bool Processing
    {
        get
        { return _processing; }
        set
        {
            _processing = value;
            this.OnPropertyChanged("Processing");
        }
    }

    private RelayCommand _search;
    public RelayCommand Search
    {
        get { return _search ?? (_search = new RelayCommand(p => OnSearch(), p => CanSearch())); }
    }
    private void OnSearch()
    {
        this.Processing = true;

        DoWork(delegate callBack);

        this.Processing = false;
    }

还有一些 XAML:

    <BooleanToVisibilityConverter x:Key="BoolToVis" />

    <me:ProcessingControl Visibility="{Binding Path=Processing, Converter={StaticResource ResourceKey=BoolToVis}}"/>

【问题讨论】:

  • 您可能需要在后台线程中执行 DoWork() 方法,方法是使用来自 TPL 的 BackgroundWorkerTask&lt;T&gt;,或者如果您使用的是 C# 5 (VS 2012 ) 你可以在上面await
  • 我会试试的。然而,我的好奇心仍然存在。控制流不应该通过 OnPropertyChanged 并在到达 DoWork() 之前更新 UI 吗?
  • 不,因为您让 UI 线程忙于执行您的 DoWork() 方法,因此在您的代码完成执行之前它无法刷新 UI。
  • +1,这正是我实现弹出窗口的方式,除了任何和所有同步耗时的工作都应该在BackgroundWorker 中进行。将您的工作方法订阅到后台工作人员的DoWork 事件并设置Processing = true。然后为RunWorkerCompleted订阅一个整理方法,你应该在其中设置Processing = false
  • @HighCore,我建议您添加您的 cmets 作为答案并让 Michael 接受。

标签: c# wpf multithreading


【解决方案1】:

使用Task或Background Worker做DoWork,在启动任务或Background Worker之前设置Processing=true,在任务结束时设置为false。这将使处理控件可见和隐藏。如果您在任务或后台工作人员中链接 bool Processing 的值,请确保您通过调度程序调用它

【讨论】:

    猜你喜欢
    • 2011-10-12
    • 2011-09-25
    • 2012-07-17
    • 1970-01-01
    • 2013-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    相关资源
    最近更新 更多