Windows应用商店的应用开发 - 常规WPF项目InvalidateRequerySuggested
我以迫使再次执行的值转换器使用Windows应用商店的应用开发 - 常规WPF项目InvalidateRequerySuggested
CommandManager.InvalidateRequerySuggested();
。
现在,在Windows Store应用开发这个方便的命令不再可用。 是否存在一个等价的命令或别的什么?
非常感谢您的帮助!
的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; }
}
然而,在WinRT中,这是不支持的,在我WinRT版本任何使代理命令的状态无效的代码必须调用Refresh
方法,以使视图中的绑定项目重新查询该命令。
我觉得您的具体问题的最佳解决办法是在您的视图模型来实现INotifyPropertyChanged
。在此接口上调用PropertyChanged
事件相当于我的Refresh
方法,并强制视图中的绑定元素自行重新评估,从而重新运行所有关联的IValueConverter
实例。
根据的Microsoft Developer Network它与Windows 8和框架4.5的工作。然而,它确实说明如下:
命令管理只注重于 一定的条件下确定何时命令目标发生了变化,比如在 键盘焦点的变化。在CommandManager中不 充分确定了引起 命令无法执行条件发生变化的情况下,InvalidateRequerySuggested可以调用 力CommandManager可以提高RequerySuggested事件。
但由于它没有提到的Windows Mobile下面的WinRT Windows设备是兼容的,上面的命令可能不适用于这些设备的工作,但如果它是Windows应用商店的WinRT和Windows 8这应该只是罚款。
如果我误解了你的问题,请让我知道,我会尽力提供进一步协助。
感谢您的回复,Greg。但可悲的是你甚至无法引用PresentationCore.dll /使用System.Windows.Input命名空间,因为它们与Windows应用商店项目不兼容。 – 2013-02-23 07:42:40
真的很奇怪。虐待测试,以后看看我想出了什么 – Greg 2013-02-23 08:06:10
要强制执行一个值转换器?难道你不应该使有问题的财产失效吗?我使用CommandManager.InvalidateRequerySuggested无效命令CanExecute状态,每当我需要不再运行值转换器。那是你的追求? – FuleSnabel 2013-02-23 17:47:58
是的,确切地说。价值转换器只是另一个我想要失效的地方。 – 2013-02-23 20:34:07
在更新命令的情况下,我认为你必须在Windows商店应用中自己推出这个功能。基本上,旧命令将可执行更改事件委托给RequerySuggested事件。有可能做一些类似自己的事情。 – FuleSnabel 2013-02-23 22:31:05