在常规的WPF项目中,我使用了
CommandManager.InvalidateRequerySuggested();
为了强制再次执行值转换器。
现在,在Windows Store应用程序开发中,这个方便的命令不再可用。是否存在等效的命令或其他可以完成此任务的东西?
非常感谢您的帮助!
在常规的WPF项目中,我使用了
CommandManager.InvalidateRequerySuggested();
CommandManager
在 WinRT 中不存在。您需要手动刷新侦听器。以下是我示例实现的 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; }
}
Refresh
方法,以使视图中绑定的项目重新查询命令。INotifyPropertyChanged
。调用此接口上的PropertyChanged
事件等同于我的Refresh
方法,强制视图中的绑定元素重新评估自身,并因此重新运行所有相关的IValueConverter
实例。