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