WPF MenuItem.Command liaison aux résultats ElementName à System.Windows.Data Erreur: 4: Impossible de trouver la source pour la liaison avec référence
J'ai le code XAML suivant:
<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>
Le Code derrière pour ce UserControl a deux ICommand propriétés avec des noms: RemoveItemCmd et GetItemPropertiesCmd. Cependant, je reçois
Système.De Windows.Erreur de données: 4 : Impossible de trouver la source pour la liaison avec la référence "ElementName=root'. BindingExpression:Path=RemoveItemCmd; DataItem=null; élément cible est " MenuItem (Nom='miRemove'); cible de propriété est "Commande" type ICommand') Système.De Windows.Erreur de données: 4 : Impossible de trouver la source pour la liaison avec la référence "ElementName=root'. BindingExpression:Path=GetItemPropertiesCmd; DataItem=null; élément cible est "MenuItem' (Name="); la propriété cible est "Commande" type ICommand')
quand UserControl est construit. Pourquoi est-ce et comment puis-je le résoudre?
source d'informationauteur Klaus Nji
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas lier à l'aide nom de l'élément dans un menu contextuel. Le lien est rompu entre le menu contextuel et de son emplacement cible. Vous pouvez contourner ce problème en utilisant un couple de trucs que...
Utiliser le placement de la cible de liaison dans le menu contextuel du DataContext. Cela vous permet d'obtenir au moins le contexte de données de l'élément, le menu contextuel s'affiche sur le menu contextuel.
DataContext="{Binding RelativeSource={RelativeSource Mode=Auto}, Path=PlacementTarget.DataContext}"
(et je pense que c'est ce que vous voulez), Vous pouvez accéder à une ressource statique, ElementSpy vous permet de lier à la fenêtre à l'aide d'une ressource statique de sorte que vous pouvez ensuite utiliser un defacto ElementName liaisons.
Meilleure solution ici ElementName de Liaison de MenuItem dans ContextMenu
Une seule ligne de code:
Avec .NET 4.0, vous pouvez le faire comme ceci: