C# WPF控制可见度w/ICommand&;不动产变更

C# WPF控制可见度w/ICommand&;不动产变更,c#,wpf,multithreading,C#,Wpf,Multithreading,我有一个带有3个控件的用户窗口——一个“执行”按钮、一个结果控件和一个处理控件。我的目标是在按下execute后显示处理控件,然后在execute方法完成时隐藏它 但是,当我假设处理控件将。。。相反,它仅在调用(如果)回调函数时显示,该函数创建另一个提示用户输入的窗口 处理控件的可见性通过BoolToVis转换器绑定到my viewmodel中的bool处理。execute方法在开始时将处理设置为true,然后在完成时将其设置为false。处理的setter调用OnPropertyChanged

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

但是,当我假设处理控件将。。。相反,它仅在调用(如果)回调函数时显示,该函数创建另一个提示用户输入的窗口

处理控件的可见性通过BoolToVis转换器绑定到my viewmodel中的bool
处理
。execute方法在开始时将
处理设置为true,然后在完成时将其设置为false。
处理的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,在启动任务或后台工作程序之前将Processing=true设置为true,并在任务结束时将其设置为false。这将使处理控制可见和隐藏。如果在任务或后台工作程序中链接bool Processing的值,请确保通过dispatcher调用它,您可能需要在后台线程中执行
DoWork()
方法,或者使用TPL中的
BackgroundWorker
task
,或者如果您使用的是C#5(VS 2012)你可以等待,我会试试的。然而,我的好奇心仍然存在。控件是否应该在到达DoWork()之前通过OnPropertyChanged并更新UI?否,因为您让UI线程忙于执行DoWork()方法,因此在代码完成执行之前它无法刷新UI。+1,这正是我实现弹出窗口的方式,除此之外,任何和所有同步耗时的工作都应该在
后台工作人员中进行。向后台工作人员的
DoWork
事件订阅您的工作方法,并设置
Processing=true
。然后订阅一个finishing方法到
RunWorkerCompleted
,您应该在其中设置
Processing=false
@HighCore,我建议您添加您的注释作为答案,并让Michael接受。