好吧,让我尝试解释一下。
我有一个可以触发某种扫描过程的应用程序。此扫描过程将启动(仅一个数字)10个后台工作人员,他们会做某事。经过(再次,只是一个数字)5秒后,我想
ViewModel
Command绑定PerformUpdateCommand
,它们的CanExecute
属性为IsPerformUpdateAllowed
。IsPerformUpdateAllowed
在我的任务完成时设置依赖项属性。我以为我会做的:
DispatcherTimer
“滴答”出现时,我计算数据并将属性IsPerformUpdateAllowed
设置为true或false。这基本上可以按预期工作(UI保持响应状态,...),只是进行了一些小操作:UI尚未更新(未启用按钮)。一旦将窗口放到背景中并放回前景中,就启用了命令,并且该IsPerformUpdateAllowed
属性也设置为true。同样,当我按下按钮后(在禁用状态下),它将被启用。
因此,尽管我正确设置了依赖项属性,但UI对此更改没有反应。
有人知道为什么吗?有趣的是,我还在UI中将一些文本设置为标签-此文本已正确更新。只是告诉命令的属性CanExecute
不会触发UI更新。
计时器初始化的代码。
_scanTimer = new DispatcherTimer();
_scanTimer.Interval = new TimeSpan(0, 0, 0, 3);
_scanTimer.Tick += delegate
{
// After the timer has elapsed (some time passed), cancel all scans and update the result
_scanTimer.Stop();
UpdateScanResults();
CancelNormalScans(false);
};
_scanTimer.Start();
编码命令如何绑定到WPF元素(按钮实际上是一个超链接):
<Label Grid.Row="1" Grid.Column="1">
<Hyperlink Command="{Binding ReadSettingsCommand}">
<TextBlock Text="{Binding Source={StaticResource Loc}, Path=Labels.ReadSettings}"></TextBlock>
</Hyperlink>
</Label>
这是命令的代码
public RelayCommand ReadSettingsCommand
{
get
{
return _readSettingsCommand
?? (_readSettingsCommand = new RelayCommand(ExecuteReadSettings, () => IsScannedDeviceAvailable && !IsUpdateInProgress));
}
}
该代码实际上取决于两个依赖项属性IsScannedDeviceAvailable和NOT IsUpdateInProgress。两者都是依赖项属性。
更新:我刚刚读到与CanExecute属性的绑定只是一次。如果要重新验证,则需要在命令上调用RaiseCanExecuteChanged。这可行,但是有点麻烦,因为现在每次两个属性之一更改时,我都需要手动调用它。实际上,我希望可以自动处理该问题。关于如何更轻松地完成此操作的任何想法?在CanExecute和属性之间没有某种单向绑定的方法吗?
只要设置了IsScannedDeviceAvailable / IsUpdateInProgress,就可以在您的VM上调用RaiseCanExecuteChanged。或者我个人最喜欢的还是创建您自己的实现,ICommand
因为它非常简单。
public class FooCommand : ICommand
{
private bool _canExecute;
private Action _delegate;
public event EventHandler CanExecuteChanged;
public new bool CanExecute
{
get
{
return _canExecute;
}
set
{
_canExecute = value;
if(CanExecuteChanged != null)
CanExecuteChanged();
}
}
public void Execute(object parameter)
{
_delegate();
}
bool ICommand.CanExecute()
{
return CanExecute;
}
public FooCommand(Action action)
{
_delegate = action;
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句