私が使用した通常のWPFプロジェクトでは
CommandManager.InvalidateRequerySuggested();
値コンバーターを強制的に再実行するため。
現在、Windows Storeアプリの開発では、この便利なコマンドは使用できなくなりました。トリックを行う同等のコマンドまたは何か他のものが存在しますか?
あなたの助けをどうもありがとう!
私が使用した通常のWPFプロジェクトでは
CommandManager.InvalidateRequerySuggested();
値コンバーターを強制的に再実行するため。
現在、Windows Storeアプリの開発では、この便利なコマンドは使用できなくなりました。トリックを行う同等のコマンドまたは何か他のものが存在しますか?
あなたの助けをどうもありがとう!
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バージョンでは、デリゲートコマンドの状態を無効にするコードはRefresh
メソッドを呼び出して、ビュー内のバインドされたアイテムにコマンドを再クエリさせる必要があります。
INotifyPropertyChanged
特定の問題に対する最善の解決策は、ビューモデルに実装することだと思います。このインターフェイスでイベントを呼び出すことはPropertyChanged
、私のメソッドと同等Refresh
であり、ビュー内のバインドされた要素にそれ自体を再評価させ、したがって、関連するすべてのIValueConverter
インスタンスを再実行させます。
Microsoft Developer Networkによると、Windows8およびFramework4.5で動作します。ただし、次のように記載されています。
CommandManagerは、キーボードフォーカスの変更など、コマンドターゲットがいつ変更されたかを判断する際に特定の条件にのみ注意を払います。CommandManagerが、コマンドを実行できなくなるような条件の変化を十分に判断できない場合は、InvalidateRequerySuggestedを呼び出して、CommandManagerにRequerySuggestedイベントを発生させることができます。
ただし、WinRTの下のWindows Mobile for Windowsデバイスが準拠していることについては言及されていないため、上記のコマンドはこれらのデバイスでは機能しない可能性がありますが、Windows Store forWinRTおよびWindows8の場合は、問題なく機能するはずです。
私があなたの質問を誤解したならば、私に知らせてください、そして、私はさらに援助しようとします。