2

いくつかのボタンを備えたユーザーコントロール(ctlToolbarEdit)を作成しましたが、簡単にするために、cmdSaveという1つのボタンがあるとしましょう。

ctlToolbarEditでIsSaveEnabledプロパティを公開し、trueに設定するとcmdSave.IsEnabled = trueに設定され、(明らかに)falseに設定するとcmdSave.IsEnabled=falseに設定されます。

最後に、そのプロパティにバインドできるようにしたい..コントロールをホストしているフォームがバインドされているビューモデルのIsValidプロパティにIsSaveEnabledをバインドしたい

それで。ctlToolbarEditの背後にあるコードは次のとおりです

    private readonly DependencyProperty IsSaveEnabledProperty = DependencyProperty.Register("IsSaveEnabled", typeof(bool), typeof(ctlToolbarEdit));

    public ctlToolbarEdit()
    {
        InitializeComponent();
    }

    public bool IsSaveEnabled
    {
        get { return (bool)GetValue(IsSaveEnabledProperty); }
        set 
        {   
            SetValue(IsSaveEnabledProperty, value);
            cmdSave.IsEnabled = value;
        }
    }

このユーザーコントロールをホストしているフォームのXAMLは次のとおりです。

<ctl:ctlToolbarEdit IsSaveEnabled="{Binding IsValid}" />

テストとして、このXAML行をctlToolbarEditをホストしているフォームに追加しました(これにより、生成しようとしている動作が複製されます)。

<Button Name="cmdSaveTest" Content="Save" IsEnabled="{Binding IsValid}" />

私の結果はこれです:

  • 追加したボタンは期待どおりに機能します。IsValidプロパティが変更されるたびに、cmdSaveTestボタンのIsEnabled値が変更されます(有効/無効になっていることがわかります)。これは、IsValidプロパティが適切に起動していることを示しています...つまり、そのプロパティにバインドできるので、そのプロパティとビューモデルへのバインドはすべて問題ありません。

  • ctlToolbarEdit内のcmdSaveボタンは何もしません。

実際、ctlToolbarEditのプロパティのゲッターとセッターにいくつかのブレークポイントを設定しましたが、これらは起動しないようです。

誰かが私が見落としている痛々しいほど明白なことを教えてもらえますか?

編集

典型的な。あなたは何時間も検索に費やし、最後に弾丸を噛んでStack Overflowに投稿し、ほとんどすぐにあなたの質問に答える何かを見つけます。

私は今知っています:

  • 私のプロパティゲッターとセッターはCLRによって無視されます。GetValueとSetValueを直接呼び出します。これが私のブレークポイントが尊重されない理由(そのコードは実際には起動しない!)であり、cmdSaveのIsEnabledプロパティが機能しない理由です。

だから:それはすべて言った...それでは、私が達成したいことを実際にどのように達成するのですか?ありがたいことに助けてください。

編集

わかりました...もっと進歩します。PropertyMetadataを使用しているようです。追加した:

, new PropertyMetadata(new PropertyChangedCallback(OnIsSaveEnabledChanged))

IsSaveEnabledProperty DependencyPropertyステートメントに(次のようになります)

private readonly DependencyProperty IsSaveEnabledProperty = DependencyProperty.Register("IsSaveEnabled", typeof(bool), typeof(ctlToolbarEdit), new PropertyMetadata(new PropertyChangedCallback(OnIsSaveEnabledChanged)));

しかし、今、私が書く必要のあるOnIsSaveEnabledChangedメソッドは「静的」でなければならず、そのメソッド内でcmdSaveにアクセスできません。

今、私は本当に立ち往生しています。何か助けはありますか?

DS

4

1 に答える 1

2

通常のMVVMパターンでは、これを逆に行います。コマンドのCanExecute / IsEnabledプロパティは、コントロールのIsEnabledプロパティを制御します。したがって、ビューモデルが保存が利用できないと判断すると、コマンドのCanExecute / IsEnabledフラグがfalseになり、そのコマンドを使用するすべてのコントロールが無効になります。例として、ButtonコントロールがICommandでどのように機能するかを見てみましょう。

http://msdn.microsoft.com/en-us/library/ms752308.aspx

http://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx#sec10

于 2012-04-19T14:20:43.400 に答える