wpf扩展器模板:在折叠状态下创建时不存在ItemsPresenter

时间:2014-02-24 14:12:17

标签: wpf itemscontrol expander

这是我用于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中)

有更好的方法吗?谢谢!

0 个答案:

没有答案