2015-03-31 45 views
0

在我的UserConterl中。無法在元素ResourceDictionary中綁定DataContext

<UserControl.Resources > 
    <ResourceDictionary >  
     <ContextMenu x:Key="MyContextMenu " > 
      <MenuItem Header="{Binding Header}"> 
     </ContextMenu > 
     <HierarchicalDataTemplate x:Key="MyTemplate"> 
     <TextBlock x:Key="MyTextBlock" Text = {Binding Header} ContextMenu="{StaticResource MyContextMenu }"/> 
     </HierarchicalDataTemplate > 
    </ResourceDictionary > 
</UserControl.Resources> 

<TreeView ItemTemplate="{StaticResource MyTemplate}" ItemsSource="{Binding MySources}" > 

上面的代碼在xaml中。代碼在UserControl xaml的.cs中。

public MyUserControl() 
    {   
     InitializeComponent(); 
     this.DataContext = new MyViewModel(); 
    } 


    public class MyViewModel: ViewModelBase 
    { 
     public string Header {get; set;} 
     public List<string> MySources \\ Has been assigned 
    } 

預期的結果是顯示領域當我點擊rightbutton.Actually,在彈出菜單empty.I發現文本菜單沒有綁定的DataContext。我該怎麼辦? 謝謝!

+0

如果你在調試模式下運行時,可以檢查輸出窗口任何約束力的錯誤。 – Pravin 2015-03-31 10:35:10

+0

只需檢查一下非常明顯的內容:這是你試圖運行的代碼的複製/粘貼?當您的Header屬性位於DataSheetManagerViewModel中時,您似乎已將您的UserControl鏈接到名爲MyViewModel的東西。 – goobering 2015-03-31 10:44:12

+0

@Pravin no ..我不知道ResourceDictionary中的DataContext是否會繼承UserControl。 – spark 2015-03-31 10:45:36

回答

1

減去設置您的數據上下文,如果您嘗試將上下文菜單項綁定到父控件的數據上下文,則必須使用PlacementTarget.Tag技巧。這是因爲上下文菜單位於不同的可視化樹上。

你也不需要報頭<TextBlock Text="{Binding Header}",把它作爲<TextBlock Text="{Binding}"

<Grid Background="DarkGray"> 
    <Grid.Resources> 
     <ContextMenu x:Key="CM"> 
      <MenuItem Header="{Binding PlacementTarget.Tag.Header, 
             RelativeSource={RelativeSource AncestorType=ContextMenu, Mode=FindAncestor}}"/> 
     </ContextMenu> 
     <HierarchicalDataTemplate x:Key="MyTemplate"> 
      <TextBlock Text="{Binding}" 
         ContextMenu="{StaticResource CM }" 
         Tag="{Binding DataContext,RelativeSource={RelativeSource AncestorType=TreeView, Mode=FindAncestor}}"/> 
    </HierarchicalDataTemplate > 
    </Grid.Resources> 
    <Grid.RowDefinitions> 
     <RowDefinition/> 
    </Grid.RowDefinitions> 
    <TreeView Grid.Row="0" 
       ItemTemplate="{StaticResource MyTemplate}" 
       ItemsSource="{Binding Sources}"></TreeView> 
</Grid> 
+0

非常感謝。我從來沒有使用過PlacementTarget。使用PlacementTarget之後就很好。答案是你的。 – spark 2015-04-01 03:24:02

相關問題