在我使用过的常规 WPF 项目中
CommandManager.InvalidateRequerySuggested();
为了强制再次执行值转换器。
现在,在 Windows Store App 开发中,这个方便的命令不再可用。是否存在等效的命令或其他可以解决问题的命令?
非常感谢你的帮助!
在我使用过的常规 WPF 项目中
CommandManager.InvalidateRequerySuggested();
为了强制再次执行值转换器。
现在,在 Windows Store App 开发中,这个方便的命令不再可用。是否存在等效的命令或其他可以解决问题的命令?
非常感谢你的帮助!
WinRT中CommandManager
不存在 。您需要手动刷新侦听器。这是我的示例实现DelegateCommand<T>
,说明了这一点:
using System;
using System.Windows.Input;
public class DelegateCommand<T> : ICommand
{
private readonly Action<T> m_executeAction;
private readonly Predicate<T> m_canExecutePredicate;
public DelegateCommand(Action<T> executeAction)
: this(executeAction, null)
{
}
public DelegateCommand(Action<T> executeAction, Predicate<T> canExecutePredicate)
{
if (executeAction == null)
{
throw new ArgumentNullException("executeAction");
}
m_executeAction = executeAction;
m_canExecutePredicate = canExecutePredicate;
}
public event EventHandler Executed;
public event EventHandler CanExecuteChanged;
bool ICommand.CanExecute(object parameter)
{
return CanExecute((T)parameter);
}
void ICommand.Execute(object parameter)
{
Execute((T)parameter);
}
public bool CanExecute(T parameter)
{
var result = true;
var canExecutePredicate = m_canExecutePredicate;
if (canExecutePredicate != null)
{
result = canExecutePredicate(parameter);
}
return result;
}
public void Execute(T parameter)
{
m_executeAction(parameter);
RaiseExecuted();
}
public void Refresh()
{
RaiseCanExecuteChanged();
}
protected virtual void RaiseExecuted()
{
var handler = Executed;
if (handler != null)
{
handler(this, EventArgs.Empty);
}
}
protected virtual void RaiseCanExecuteChanged()
{
var handler = CanExecuteChanged;
if (handler != null)
{
handler(this, EventArgs.Empty);
}
}
}
该类的WPF版本CommandManager.InvalidateRequerySuggested
通过实现间接使用CanExecuteChanged
如下:
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
但是,在 WinRT 中,这不受支持,并且在我的 WinRT 版本中,任何使委托命令的状态无效的代码都必须调用该Refresh
方法以使视图中的绑定项重新查询该命令。
我认为针对您的特定问题的最佳解决方案是INotifyPropertyChanged
在您的视图模型中实现。在此接口上调用PropertyChanged
事件等效于我的Refresh
方法,并强制视图中的绑定元素重新评估自身,从而重新运行所有关联的IValueConverter
实例。
根据 Microsoft Developer Network 的说法,它确实适用于 Windows 8 和 Framework 4.5。但是,它确实声明了以下内容:
CommandManager 在确定命令目标何时更改时仅关注某些条件,例如键盘焦点的更改。在 CommandManager 无法充分确定导致命令无法执行的条件变化的情况下,可以调用 InvalidateRequerySuggested 以强制 CommandManager 引发 RequerySuggested 事件。
但是,由于它没有提到 WinRT 以下 Windows 设备的 Windows Mobile 兼容,因此上述命令可能不适用于这些设备,但如果它适用于 WinRT 和 Windows 8 的 Windows Store,它应该可以正常工作。
如果我误解了您的问题,请告诉我,我会尽力提供进一步的帮助。