这是我用于wpf TreeViewItem的模板:
<Style x:Key="MyExpanderStyle" TargetType="Expander">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Expander}">
<Border CornerRadius="2" BorderBrush="Gray" BorderThickness="1">
<Grid SnapsToDevicePixels="True">
<Grid.RowDefinitions>
<RowDefinition Name="ExpHeaderRow" Height="20"/>
<RowDefinition Name="ExpContentRow" Height="*"/>
</Grid.RowDefinitions>
<HeaderedContentControl Grid.Row="0" Header="{Binding}" HeaderTemplateSelector="{StaticResource MyHeaderTemplateSelector}"/>
<ContentPresenter x:Name="ExpandSite" Grid.Row="1" Visibility="Collapsed" Margin="{TemplateBinding Padding}">
</ContentPresenter>
</Grid>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsExpanded" Value="True">
<Setter Property="Visibility" TargetName="ExpandSite" Value="Visible"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
该样式用于应用于TreeViewItem的另一种样式:
<Style x:Key="tviStyle" TargetType="TreeViewItem"}
...
<Expander Style="{StaticResource MyExpanderStyle}" IsExpanded="{Binding Path=IsExpanded}">
<Expander.Content>
<ItemsPresenter/> <!-- is null when not yet expanded !! -->
</Expander.Content>
</Expander>
...
现在在代码中,我用这个:
ItemsPresenter itemsPresenter = itemsControl.FindVisualDescendant<ItemsPresenter>();
当我在viewmodel构造函数中设置IsExpanded = true时,给了我itemsPresenter。 当构造时IsExpanded = False时,它给出null。
所以wpf在Expanders状态变为“Expanded”时创建UIElements。那没问题。 但是有些情况是在折叠状态下创建项目,并且我想访问扩展内容(itemsPresenter)上绑定的数据。已创建视图模型,除wpf UIElements外,所有数据都存在。
在viewmodel构造函数中有一些笨拙的方法,比如Expanded = true,然后设置Expanded = false(例如在OnLoaded中)
有更好的方法吗?谢谢!