que español data conversion context wpf data-binding xaml

español - wpf binding context



WPF MenuItem.Command vincula a los resultados de ElementName a System.Windows.Data Error: 4: No se puede encontrar el origen para el enlace con referencia (3)

Tengo el siguiente XAML:

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

El código subyacente para este UserControl tiene dos propiedades ICommand con nombres: RemoveItemCmd y GetItemPropertiesCmd. Sin embargo, me sale

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?


Con .NET 4.0 puedes hacerlo así:

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


No puede vincular usando 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. Utilice 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 = {RelativeSource Mode = Self}, Path = PlacementTarget.DataContext}"

  3. (y creo que esto es lo que desea) Puede acceder a un recurso estático, ElementSpy le permite vincularse a la ventana usando un recurso estático para que pueda usar enlaces de Elemento defacto.