2013-02-17 122 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

相關問題