Windows应用商店应用开发 - InvalidateRequerySuggested

时间:2013-02-17 21:01:46

标签: c# windows-store-apps ivalueconverter

在我使用的常规WPF项目中

CommandManager.InvalidateRequerySuggested();

为了强制值转换器再次执行。

现在,在Windows应用商店应用开发中,这个方便的命令不再可用。 是否存在等效的命令或其他什么呢?

非常感谢你的帮助!

2 个答案:

答案 0 :(得分:3)

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版本中,任何使delegate命令状态无效的代码都必须调用Refresh方法,以使视图中的绑定项重新查询命令。

我认为针对您的具体问题的最佳解决方案是在您的视图模型中实施INotifyPropertyChanged。在此接口上调用PropertyChanged事件等同于我的Refresh方法,并强制视图中的绑定元素重新评估自身,从而重新运行所有关联的IValueConverter实例。

答案 1 :(得分:0)

根据Microsoft Developer Network,它可以与Windows 8和Framework 4.5一起使用。但是,它确实说明了以下内容:

  

CommandManager仅关注某些条件   确定命令目标何时发生了变化,例如改变   键盘焦点。在CommandManager没有的情况下   充分确定导致命令的条件的变化   无法执行,可以调用InvalidateRequerySuggested   强制CommandManager引发RequerySuggested事件。

但由于它没有提到Windows Mobile for Windows设备,因此WinRT符合上述命令可能不适用于这些设备,但如果它适用于Windows Store for WinRT和Windows 8,它应该可以正常工作。

如果我误解了您的问题,请告诉我,我会尽力协助您。

Article about command here: