2013-02-17 64 views
3

我以迫使再次执行的值转换器使用Windows应用商店的应用开发 - 常规WPF项目InvalidateRequerySuggested

CommandManager.InvalidateRequerySuggested(); 

现在,在Windows Store应用开发这个方便的命令不再可用。 是否存在一个等价的命令或别的什么?

非常感谢您的帮助!

+0

要强制执行一个值转换器?难道你不应该使有问题的财产失效吗?我使用CommandManager.InvalidateRequerySuggested无效命令CanExecute状态,每当我需要不再运行值转换器。那是你的追求? – FuleSnabel 2013-02-23 17:47:58

+0

是的,确切地说。价值转换器只是另一个我想要失效的地方。 – 2013-02-23 20:34:07

+1

在更新命令的情况下,我认为你必须在Windows商店应用中自己推出这个功能。基本上,旧命令将可执行更改事件委托给RequerySuggested事件。有可能做一些类似自己的事情。 – FuleSnabel 2013-02-23 22:31:05

回答

3

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实例。

0

根据的Microsoft Developer Network它与Windows 8和框架4.5的工作。然而,它确实说明如下:

命令管理只注重于 一定的条件下确定何时命令目标发生了变化,比如在 键盘焦点的变化。在CommandManager中不 充分确定了引起 命令无法执行条件发生变化的情况下,InvalidateRequerySuggested可以调用 力CommandManager可以提高RequerySuggested事件。

但由于它没有提到的Windows Mobile下面的WinRT Windows设备是兼容的,上面的命令可能不适用于这些设备的工作,但如果它是Windows应用商店的WinRT和Windows 8这应该只是罚款。

如果我误解了你的问题,请让我知道,我会尽力提供进一步协助。

Article about command here:

+0

感谢您的回复,Greg。但可悲的是你甚至无法引用PresentationCore.dll /使用System.Windows.Input命名空间,因为它们与Windows应用商店项目不兼容。 – 2013-02-23 07:42:40

+0

真的很奇怪。虐待测试,以后看看我想出了什么 – Greg 2013-02-23 08:06:10