Salutations,WPF: Définition d'une liaison pour toutes les instances TreeViewItem
J'utilise WPF avec un modèle Model-View-ViewModel, et j'ai un modèle de vue avec une propriété IsSelected
que je veux lier à un TreeViewItem
IsSelected
propriété pour tous TreeViewItem
s dans la portée. Je tente de le faire avec un Style
et un Setter
. Cela fonctionne apparemment pour le niveau racine TreeViewItem
s, mais pas pour leurs enfants. Pourquoi est-ce? Comment puis-je l'appliquer à tous les contrôles TreeViewItem
?
Voici la vue XAML:
<UserControl x:Class="MyApp.AllAreasView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:MyApp="clr-namespace:MyApp"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="700">
<UserControl.Resources>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="IsSelected"
Value="{Binding IsSelected, Mode=TwoWay}"/>
</Style>
<MyApp:CountVisibilityConverter x:Key="CountVisibilityConverter" />
<HierarchicalDataTemplate x:Key="AreaTemplate"
DataType="AreaViewModel"
ItemsSource="{Binding Path=SubareasCollectionView}">
<WrapPanel>
<TextBlock Text="{Binding Path=Name}" Margin="0 0 8 0" />
<TextBlock DataContext="{Binding Path=Subareas}"
Text="{Binding Path=Count, StringFormat= (\{0\})}"
Visibility="{Binding Path=Count, Converter={StaticResource CountVisibilityConverter}}" />
</WrapPanel>
</HierarchicalDataTemplate>
</UserControl.Resources>
<TreeView ItemsSource="{Binding TopLevelAreas}"
ItemTemplate="{StaticResource AreaTemplate}">
</TreeView>
</UserControl>
Merci pour avoir l'exemple de travail (et déduisant le modèle simple vue). Il s'avère que j'avais généré deux ensembles distincts de modèles de vue et l'événement PropertyChanged n'était pas géré correctement sur mes modèles de vue depuis que j'avais accroché un, et WPF l'autre. En suivant la piste de l'événement et en examinant les résultats de GetInvocationList() du délégué PropertyChanged, amenez-moi à trouver ceci. Puisque vous avez prouvé que cela fonctionne, je vais accepter cela comme réponse. – codekaizen