WPF控件可见性使用ICommand和OnPropertyChanged

3
我有一个用户窗口,包含3个控件 - 一个“执行”按钮、一个结果控件和一个处理控件。我的目标是,在按下“执行”按钮后显示处理控件,当执行方法完成时隐藏它。
然而,当我按照预期去做时,处理控件并没有显示出来...只有在调用创建另一个提示用户输入的窗口的回调函数时才会显示出来。
处理控件的可见性通过BoolToVis转换器绑定到我的视图模型中的bool变量Processing。执行方法在开始时将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}}"/>

4
你可能需要在后台线程中执行DoWork()方法,可以通过使用BackgroundWorker或TPL中的Task<T>来实现,如果你正在使用C# 5(VS 2012),可以使用await来执行该方法。 - Federico Berasategui
我会尝试的。然而,我的好奇心仍在。在到达DoWork()之前,控制流不应该通过OnPropertyChanged并更新UI吗? - Michael
1
不行,因为你正在让UI线程忙于执行DoWork()方法,因此它无法在你的代码完成执行之前刷新UI。 - Federico Berasategui
1
+1,这正是我实现弹出窗口的方式,除了所有同步耗时工作都应该在BackgroundWorker中进行。将您的工作方法订阅到后台工作者的DoWork事件,并设置Processing = true。然后订阅一个完成方法到RunWorkerCompleted,在其中您应该设置Processing = false - Will Faithfull
@HighCore,我建议您将您的评论作为答案添加,并让Michael接受它。 - Alex Paven
1个回答

0
使用Task或Background Worker来执行DoWork,在开始任务或后台工作之前设置Processing=true,并在任务结束时将其设置为false。这将使Processing控件可见和隐藏。如果您在任务或后台工作者中链接bool Processing的值,请确保通过调度程序调用它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接