我以迫使再次執行的值轉換器使用Windows應用商店的應用開發 - 常規WPF項目InvalidateRequerySuggested
CommandManager.InvalidateRequerySuggested();
。
現在,在Windows Store應用開發這個方便的命令不再可用。 是否存在一個等價的命令或別的什麼?
非常感謝您的幫助!
我以迫使再次執行的值轉換器使用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