J'essaie de personnaliser le contrôle TreeView
. Lorsqu'un utilisateur sélectionne un élément dans la TreeView
, j'ai besoin ActualWidth
du SelectedItem
à stocker dans la balise de l'élément:Problèmes de liaison WPF
<Style x:Key="{x:Type TreeViewItem}" TargetType="{x:Type TreeViewItem}">
<!-- ... -->
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TreeViewItem}">
<Grid ShowGridLines="True">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<Rectangle x:Name="rect" />
<ContentPresenter x:Name="PART_Header" ContentSource="Header" Margin="5" />
<ItemsPresenter x:Name="ItemsHost" Grid.Row="1" Grid.Column="1" />
<!-- ... -->
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsSelected" Value="true">
<Setter Property="Tag" Value="{Binding ElementName=rect, Path=ActualWidth}" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Plus tard, j'écoute l'événement SelectedItemChanged
du TreeView
:
private void views_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
TreeViewItem item = (TreeViewItem)e.NewValue;
double i = (double)item.Tag;
}
Maintenant, le problème est que item.Tag est toujours nul. Est-ce un problème avec ma liaison? Ou devrait-on faire les choses différemment?
Essayez de regarder dans la fenêtre de sortie pour produire des erreurs de liaison – arconaut
Il n'y a pas de données erreurs de liaison signalées. – Austin
apparemment, il n'est pas possible par ElementName: http://stackoverflow.com/questions/705853/binding-elementname-does-it-use-visual-tree-or-logical-tree. Et il n'y a pas d'extension de balisage 'FindVisualChildByType'. Par conséquent, vous avez besoin d'une autre solution de contournement. Quel problème essayez-vous de résoudre? – jonny