2010-03-27 231 views
0

我有一個TreeView,我將它關聯到一個ContextMenu。該contextmenu有一個項目,我想要綁定到我的ViewModel的IsChecked屬性。由於我正在使用樹,因此每個treeitem都綁定到ViewModel的子屬性。WPF Treeview contextmenu IsChecked綁定MVVM

在VS2010輸出窗口我看到這個數據綁定錯誤:

BindingExpression路徑錯誤:對 '對象' '' HostMgmtViewModel '(的HashCode = 12565727)' 未找到 'IsAutoStart' 屬性。 BindingExpression:路徑= IsAutoStart; DataItem ='HostMgmtViewModel'

這清楚地表明它試圖綁定到我的ViewModel而不是綁定到treeitem的關聯數據。我如何綁定到正確的對象?請記住,我的contextmenu與整個TreeView關聯,而不是與特定的Treeitem關聯。

----------編輯

由於xandy指出瞭解決我的問題下面是綁定器isChecked這樣的:

{Binding Path=PlacementTarget.SelectedItem.IsDisabledStart, Mode=OneWay, RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}} 

回答

3
<TreeView Name="tview" Grid.Row="0" Tag="{Binding RelativeSource={RelativeSource Self}, Path=SelectedItem}"> 
     <TreeView.ContextMenu> 
      <ContextMenu> 
       <MenuItem Name="miC" Header="{Binding Path=Tag.Key}" DataContext="{Binding Path=PlacementTarget, RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}}"></MenuItem> 
      </ContextMenu> 
     </TreeView.ContextMenu> 
    </TreeView> 

這是我的工作代碼片段。禮貌[這]。 1您只需更改標籤中的綁定路徑即可。我目前將Treeview綁定到一個字典,所以它是它的Key屬性。它在綁定到任何對象集合時不應該有任何問題。一個有趣的發現是上下文菜單不是元素樹的一部分,這導致了問題。我可以綁定文本框沒有問題:

<TextBlock Grid.Row="1" DataContext="{Binding ElementName=tview, Path=SelectedItem}"> 
     <TextBlock.Text> 
      <Binding Path="Key" /> 
     </TextBlock.Text> 
    </TextBlock> 

但它不起作用,如果爲menuitem,如果我把同樣的事情。

+0

而這個綁定進入ContextMenu?當我嘗試得到這個錯誤時:'綁定'不能在'ItemCollection'集合中使用。 '綁定'只能在DependencyObject的DependencyProperty上設置。 – BrettRobi 2010-03-27 01:47:25

+0

順便說一句,我以前的答案是假設像上面的文本塊例子,但適用於menuitem頭。菜單項沒有遇到任何錯誤,但它不起作用。你得到了DependencyObject ...錯誤,因爲你綁定了數據源,但不是屬性。 – xandy 2010-03-27 02:59:51

+0

謝謝xandy,你的樣品給了我正確的答案。我結束了菜單項IsChecked綁定到這個: {Binding Path = PlacementTarget.SelectedItem.IsAutoStart,Mode = OneWay,RelativeSource = {RelativeSource AncestorType = {x:Type ContextMenu}}} – BrettRobi 2010-03-27 14:30:26