Infragistics XamDatagrid - 防止控件在不可见时被实例化

时间:2011-11-02 09:25:32

标签: wpf xaml infragistics

我们有一个Infragistics XamDatagrid,其中包含一个包含图像的列。

此图像可见或不可见,具体取决于ViewModel属性。当它可见时,如果将鼠标悬停在上方,则会显示一个弹出窗口。请参阅下面的XAML以获取此专栏。

    <Setter Property="IsEnabled" Value="true" />
    <Setter Property="Focusable" Value="false" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type DataPresenter:CellValuePresenter}">
                <Border Background="{StaticResource FrozenColumnBrush}">
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition></ColumnDefinition>
                        </Grid.ColumnDefinitions>
                        <Grid.RowDefinitions>
                            <RowDefinition></RowDefinition>
                            <RowDefinition></RowDefinition>
                        </Grid.RowDefinitions>

                        <Image x:Name="BarrierImage"
                               Grid.Row="0"
                     Height="16" Width="16"
                     HorizontalAlignment="Center" VerticalAlignment="Center"
                     Source="../Images/lock_16.ico"
                     Visibility="{Binding DataItem.IsBarrierEvent, Converter={StaticResource BooleanToVisibilityConverter}}" >
                        </Image>
                        <Grid Grid.Row="1" Visibility="{Binding DataItem.IsBarrierEvent, Converter={StaticResource BooleanToVisibilityConverter}}" >
                        <Popup
                               Name="BarrierPopup"
                               AllowsTransparency="True"
                               PopupAnimation="Fade"
                               HorizontalOffset="-35"
                               VerticalOffset="0"
                               Behaviors:OpenPopupWhenTooltipOpening.Control="{Binding ElementName=BarrierImage}"
                               >
                            <Views:BarrierView DataContext="{Binding DataItem.Barriers}"/>
                        </Popup>
                        </Grid>
                    </Grid>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>

问题是我们得到200行,但只有一行有IsBarrierEvent = true,因此只有一个图像,并且在悬停时只会显示一个弹出窗口。但事实证明,WPF为每一行创建了一个BarrierView控件。我们注意到使用dotTrace来调查性能问题时。

有没有办法阻止创建这种不可见的控件?我们还尝试将viewmodel属性绑定到主边框可见性,但它们仍在创建中。

感谢。

P.S - 我试图粘贴样式的XAML标签,但没有正确显示

1 个答案:

答案 0 :(得分:1)

我建议您创建自己的自定义控件并将图像,弹出窗口等移动到该控件的模板中。当您在模板中定义了元素并且应用了该模板时,将创建该模板中的所有元素,因此在应用CVP模板时,这意味着将创建Image,Popup,BarrierView等。如果模板中的祖先元素已折叠。但是,如果模板的可见性已折叠,则该控件的模板在首次测量之前不会应用,直到可见性被隐藏或可见时才会应用。