3

私が使用した通常のWPFプロジェクトでは

CommandManager.InvalidateRequerySuggested();

値コンバーターを強制的に再実行するため。

現在、Windows Storeアプリの開発では、この便利なコマンドは使用できなくなりました。トリックを行う同等のコマンドまたは何か他のものが存在しますか?

あなたの助けをどうもありがとう!

4

2 に答える 2

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バージョンでは、デリゲートコマンドの状態を無効にするコードはRefreshメソッドを呼び出して、ビュー内のバインドされたアイテムにコマンドを再クエリさせる必要があります。

INotifyPropertyChanged特定の問題に対する最善の解決策は、ビューモデルに実装することだと思います。このインターフェイスでイベントを呼び出すことはPropertyChanged、私のメソッドと同等Refreshであり、ビュー内のバインドされた要素にそれ自体を再評価させ、したがって、関連するすべてのIValueConverterインスタンスを再実行させます。

于 2013-02-26T06:08:25.783 に答える
0

Microsoft Developer Networkによると、Windows8およびFramework4.5で動作します。ただし、次のように記載されています。

CommandManagerは、キーボードフォーカスの変更など、コマンドターゲットがいつ変更されたかを判断する際に特定の条件にのみ注意を払います。CommandManagerが、コマンドを実行できなくなるような条件の変化を十分に判断できない場合は、InvalidateRequerySuggestedを呼び出して、CommandManagerにRequerySuggestedイベントを発生させることができます。

ただし、WinRTの下のWindows Mobile for Windowsデバイスが準拠していることについては言及されていないため、上記のコマンドはこれらのデバイスでは機能しない可能性がありますが、Windows Store forWinRTおよびWindows8の場合は、問題なく機能するはずです。

私があなたの質問を誤解したならば、私に知らせてください、そして、私はさらに援助しようとします。

ここでのコマンドに関する記事:

于 2013-02-23T00:19:22.493 に答える