2010-04-11 13 views
12

Ho il seguente XAML:WPF MenuItem.Command legame ElementName risultati a System.Windows.Data Errore: 4: Non riesci a trovare fonte per il legame con riferimento

<UserControl x:Class="EMS.Controls.Dictionary.TOCControl" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:vm="clr-namespace:EMS.Controls.Dictionary.Models" 
    xmlns:diagnostics="clr-namespace:System.Diagnostics;assembly=WindowsBase" 
    x:Name="root" > 

    <TreeView      
     x:Name="TOCTreeView"      
     Background="White" 
     Padding="3,5"  
     ContextMenuOpening="TOCTreeView_ContextMenuOpening" 
     ItemsSource="{Binding Children}" BorderBrush="{x:Null}" > 

     <TreeView.ItemTemplate> 
      <HierarchicalDataTemplate ItemsSource="{Binding Path=Children, Mode=OneTime}"> 
       <Grid > 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="Auto"/> 
         <!--<ColumnDefinition Width="Auto"/>-->      
         <ColumnDefinition Width="*"/> 
        </Grid.ColumnDefinitions> 
        <!--<CheckBox VerticalAlignment="Center" IsChecked="{Binding IsVisible}"/>--> 
        <ContentPresenter Grid.Column="0" Height="16" Width="20" 
            Content="{Binding LayerRepresentation}" /> 
        <!--<ContentPresenter Grid.Column="1"  > 
         <ContentPresenter.Content> 
          Test 
         </ContentPresenter.Content> 
        </ContentPresenter>--> 
        <TextBlock Grid.Column="2" FontWeight="Normal" Text="{Binding Path=Alias, Mode=OneWay}" > 
         <ToolTipService.ToolTip> 
          <TextBlock Text="{Binding Description}" TextWrapping="Wrap"/> 
         </ToolTipService.ToolTip> 
        </TextBlock> 
       </Grid> 
       <HierarchicalDataTemplate.ItemTemplate> 
        <HierarchicalDataTemplate ItemsSource="{Binding Path=Children, Mode=OneTime}"> 
         <!--<DataTemplate>--> 
         <Grid > 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition Width="Auto"/> 
           <ColumnDefinition Width="Auto"/>        
           <ColumnDefinition Width="*"/> 
          </Grid.ColumnDefinitions> 
          <CheckBox VerticalAlignment="Center" IsChecked="{Binding IsVisible}"/> 
          <ContentPresenter Grid.Column="1" 
            Content="{Binding LayerRepresentation, Mode=OneWay}" /> 
          <TextBlock Margin="0,1,0,1" Text="{Binding Path=Alias, Mode=OneWay}" Grid.Column="2"> 
           <ToolTipService.ToolTip> 
            <TextBlock Text="{Binding Description}" TextWrapping="Wrap"/> 
           </ToolTipService.ToolTip>     
          </TextBlock> 
         </Grid> 
         <!--</DataTemplate>--> 
        </HierarchicalDataTemplate>     
       </HierarchicalDataTemplate.ItemTemplate> 
      </HierarchicalDataTemplate> 
     </TreeView.ItemTemplate> 

     <TreeView.ContextMenu> 
      <ContextMenu> 
       <MenuItem Name="miRemove" Header="Remove" 
          Command="{Binding ElementName=root, Path=RemoveItemCmd, 
        diagnostics:PresentationTraceSources.TraceLevel=High}"> 
        <MenuItem.Icon> 
         <Image Source="../images/16x16/Delete.png"/> 
        </MenuItem.Icon> 
       </MenuItem> 
       <MenuItem Header="Properties" 
          Command="{Binding ElementName=root, Path=GetItemPropertiesCmd}"/>    
      </ContextMenu>  
     </TreeView.ContextMenu> 


    </TreeView> 

</UserControl> 

codice dietro per questo UserControl ha due proprietà ICommand con nomi: RemoveItemCmd e GetItemPropertiesCmd. Tuttavia, ottengo

 
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=root'. BindingExpression:Path=RemoveItemCmd; DataItem=null; target element is 'MenuItem' (Name='miRemove'); target property is 'Command' (type 'ICommand') 
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=root'. BindingExpression:Path=GetItemPropertiesCmd; DataItem=null; target element is 'MenuItem' (Name=''); target property is 'Command' (type 'ICommand') 

quando UserControl è costruito. Perché questo e come posso risolvere?

risposta

18

Non è possibile eseguire il binding utilizzando il nome dell'elemento da un menu di scelta rapida. Il collegamento è interrotto tra il menu di scelta rapida e il suo target di posizionamento. È possibile aggirare il problema utilizzando un paio di trucchi però ...

  1. Utilizzare RoutedUICommands con un bind del comando su UserControl, quindi non è necessaria l'associazione.
  2. Utilizzare il binding del target di posizionamento nel DataContext del menu di scelta rapida. Ciò consente di ottenere almeno il contesto di dati dell'elemento nel menu di scelta rapida del menu di scelta rapida.

    DataContext = "{Binding RelativeSource = {Modalità RelativeSource = self}, Path = PlacementTarget.DataContext}"

  3. (e credo che questo è ciò che si desidera) È possibile accedere a una risorsa statica, consente di ElementSpy collega alla finestra usando una risorsa statica in modo da poter usare un bind di ElementName defacto.

+0

meraviglioso, grazie. –

5

Con .NET 4.0 si può fare in questo modo:

<MenuItem Command="{Binding CommandName, Source={x:Reference ElementName}}"/> 
+0

A volte può darti un'eccezione ciclica di riferimento. – AgentFire

+0

Ho appena provato questo e genera un'eccezione di riferimento null? –

+0

ho le eccezioni di riferimento null e dipende da dove lo utilizzo l'eccezione ciclica. Dannazione. – juFo

Problemi correlati