【发布时间】:2015-09-30 13:58:47
【问题描述】:
我有一个显示两个日期之间的记录列表的 WPF 窗口。我用于:MVVM Light、实体框架和存储过程。
当我运行显示列表的命令时,我想显示一个进度条来表示任务正在运行。查询完成后,我想隐藏进度条。 问题是进度条的可见性不好。以下是我的代码:
//XAML
.
.
.
.
<StatusBar Grid.Row="2">
<StatusBarItem Width="300">
<TextBlock Text="{Binding SBMessage, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>
</StatusBarItem>
<StatusBarItem Width="Auto">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock Text="Requête en cours..." Visibility="{Binding TaskInProgress, UpdateSourceTrigger=PropertyChanged, Mode=OneWay, Converter={StaticResource booltovisibility}}" />
<ProgressBar
Visibility="{Binding TaskInProgress, UpdateSourceTrigger=PropertyChanged, Mode=OneWay, Converter={StaticResource booltovisibility}}"
Width="100"
Height="20"
IsIndeterminate="True"
VerticalAlignment="Center"
Grid.Column="1"
/>
</Grid>
</StatusBarItem>
</StatusBar>
//ViewModel
bool _taskinprogress = false;
public bool TaskInProgress
{
get { return _taskinprogress; }
set
{
_taskinprogress = value;
RaisePropertyChanged("TaskInProgress");
}
}
public RelayCommand DisplaySimulationsListCommand
{
get
{
if (_splist == null)
_splist = new RelayCommand(DisplaySimulationsListCommandExecute);
return _splist;
}
}
private void DisplaySimulationsListCommandExecute()
{
SBMessage = "Exécution...";
TaskInProgress = true;
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
DoItWithStoredProcedure();
stopWatch.Stop();
TimeSpan ts = stopWatch.Elapsed;
string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
ts.Hours, ts.Minutes, ts.Seconds,
ts.Milliseconds / 10);
SBMessage = ListSimulations.Count().ToString() + " Enregistrement(s) en : " + elapsedTime;
CurrentDisplayedTab = 1;
TaskInProgress = false;
//SBMessage = "Prêt";
}
private void DoItWithStoredProcedure()
{
try
{
using (UnitOfWork cx = new UnitOfWork())
{
var ls = cx.GetSimulationsPeriode(VMPeriode.Debut, VMPeriode.Fin).AsReadOnly();
ListSimulations = new ObservableCollection<Simulation>(ls);
CVS = (ListCollectionView)CollectionViewSource.GetDefaultView(ListSimulations);
RaisePropertyChanged("CVS");
}
}
catch (Exception ex)
{
Messenger.Default.Send<ExceptionMessageRefresh>(new ExceptionMessageRefresh(ex), "DoItWithStoredProcedure");
}
}
//Converter
public class BoolToVisiblityConverter : IValueConverter
{
#region Constructors
/// <summary>
/// The default constructor
/// </summary>
public BoolToVisiblityConverter() { }
#endregion
public bool Collapse { get; set; }
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
bool bValue = (bool)value;
if (bValue)
return Visibility.Visible;
else
{
if (Collapse)
return Visibility.Collapsed;
else
return Visibility.Hidden;
}
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
Visibility visibility = (Visibility)value;
if (visibility == Visibility.Visible)
return true;
else
return false;
}
#endregion
}
提前谢谢你。
【问题讨论】:
-
这很可能是因为您在主线程上执行了长时间的操作。
DoItWithStoredProcedure是做什么的?执行是否需要大量时间?如果是这样,您将希望将该操作移至后台线程。 -
该任务大约需要 1 秒,大约 19000 条记录。它在一段时间内从按日期索引的 sql server 2012 表中执行选择查询
-
它是否触及转换器的 Convert 方法?
-
照 mittmemo 说的做。在检索记录时,UI 被冻结。您还可以签出异步命令here。您希望等待 DoItWithStoredProcedure() 以便在 SP 运行时 UI 可以更新。
-
@HabibGherairi 我编辑了我的答案。阅读和理解它应该比其他答案更直观和简单。我建议在未来的项目/任务中避免遵循 Anjum 的答案中显示的相同模式。