2010-11-24 28 views
3

バインディングコードを取得しようとしています。 Basciallyグリッドのコンテキストメニューの要素のIsEnabledプロパティを、グリッド内の選択した行の値にバインドします。WPF RelativeSourceとAncestorTypeを使用したデータバインディング

私はそれがこれで作業しています

  <my:DataGrid.ContextMenu> 
       <ContextMenu DataContext="{Binding PlacementTarget.SelectedItem, RelativeSource={RelativeSource Self}}"> 
        <MenuItem Header="Grant Access" IsEnabled="{Binding Connectable}"/> 
       </ContextMenu> 
      </my:DataGrid.ContextMenu> 

しかし、私は、このようにそれをしたいし、それが働いていません。それはエラーではありませんが、メニュー項目を無効にしません。どんな考え?あなたの問題にいくつかの光を当てること - デバッグモードでは、あなたが結合エラーの詳細情報を得るでしょうしながら、あなたは、Visual Studioの出力ウィンドウを見れば

  <my:DataGrid.ContextMenu> 
       <ContextMenu> 
        <MenuItem Header="Grant Access" IsEnabled="{Binding Path=SelectedItem.Connectable, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type my:DataGrid}}}"/> 
       </ContextMenu> 
      </my:DataGrid.ContextMenu> 

答えて

2

Ancestor bindingの代わりにElementName bindingを試してみてください。 ContextMenuは、グリッドのビジュアルツリーの一部ではありません。

--edit-

ああ、私は間違っていました。 ElementNameバインディング(下記の例)もContextMenuでは動作しません。これはDataGridのビジュアルツリーの一部ではありません。そのため、DataGridを参照できないため、参照できません。あなたは最初の方法でそれをしなければなりません。

このようにしたくない理由は何ですか?

  <DataGrid.ContextMenu> 
       <ContextMenu DataContext="{Binding SelectedItem, ElementName=DataGrid1}"> 
        <MenuItem Header="Grant Access" 
           IsEnabled="{Binding Connectable}" /> 
       </ContextMenu> 
      </DataGrid.ContextMenu> 
+0

こんにちは!これを行うための構文を知っていますか? – Bob

+0

ええと私はそれを試してみましたが、出力ウィンドウからエラーが出ます:System.Windows.Data Error:4:参照 'ElementName = dataGridInstall'でバインディングのソースを見つけることができません。 BindingExpression:Path = SelectedItem; DataItem = null;ターゲット要素は 'ContextMenu'(Name = '');ターゲットプロパティは 'DataContext'(タイプ 'Object')です – Bob

+0

これは私が言ったことです。それは動作しません。 'PlacementTarget.SelectedItem'でバインディングを使用する最初のメソッドを使用する必要があります。 – decyclone

0

+0

ありがとうございましたDean、good tip – Bob

関連する問題