2010-04-11 8 views
12

Tengo el siguiente XAML:WPF MenuItem.Command unión a resultados ElementName a System.Windows.Data error: 4: No se puede encontrar la fuente para la unión con referencia

<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> 

código detrás de este control de usuario tiene dos propiedades ICommand con nombres: RemoveItemCmd y GetItemPropertiesCmd. Sin embargo, obtengo

 
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') 

cuando se construye UserControl. ¿Por qué es esto y cómo lo resuelvo?

Respuesta

18

No se puede vincular utilizando el nombre del elemento desde un menú contextual. El enlace está roto entre el menú contextual y su destino de ubicación. Sin embargo, puedes evitarlo usando un par de trucos ...

  1. Usa RoutedUICommands con un enlace de comando en el UserControl, luego no se necesita ningún enlace.
  2. Utilice el enlace de destino de ubicación en el DataContext del menú contextual. Esto le permite al menos obtener el contexto de datos del elemento en el que aparece el menú contextual en el menú contextual.

    DataContext = "{Binding RelativeSource = {Modo RelativeSource = Auto}, Path = PlacementTarget.DataContext}"

  3. (y creo que esto es lo que quiere) Se puede acceder a un recurso estático, ElementSpy le permite enlace a la ventana usando un recurso estático para que pueda usar enlaces de ElementName de facto.

+0

maravilloso, gracias. –

5

Con .NET 4.0 Puede hacerlo de esta manera:

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

A veces puede proporcionar una excepción cíclica de referencia. – AgentFire

+0

Acabo de probar esto y arroja una excepción de referencia nula? –

+0

tengo las excepciones de referencia nula y dependiendo de dónde la use la excepción cíclica. Maldita sea. – juFo

Cuestiones relacionadas