DataGridTemplateColumn中的用户控件

时间:2012-06-07 15:06:56

标签: wpf xaml datagridtemplatecolumn

我有一个数据网格,我将所有内容旋转90度以垂直显示我的信息。这与我不认为的任何事情有关。我正在尝试将一个基本上是Expander的UserControl添加到DataGridTemplateColumn中。我遇到的问题是当我打开我的扩展器(usercontrol)时,它正在它下面的单元格后面打开。我需要把它带到前面,基本上重叠它。我在画布中有它,以便用户控件不会在单元格中打开并展开。我希望单元格保持相同的大小,打开扩展器时,它将重叠并显示覆盖其下方的数据中心。我有什么想法吗?

  <DataGridTemplateColumn Header="Expander" CanUserResize="False" Width="Auto">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate DataType="UserControl">
                                <Grid Width="Auto" Height="Auto" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" SnapsToDevicePixels="True" OverridesDefaultStyle="True">
                                    <Canvas>
                                        <local:DescriptionUserControl DataContext="{Binding Path=DescriptionViewModel}" x:Name="Description" Height="Auto" Width="Auto" Focusable="True" Margin="0,-2">
                                        </local:DescriptionUserControl>
                                    </Canvas>
                                </Grid>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>

                    <DataGridTemplateColumn Header="Worksheet" Width="Auto">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <Button Content="View Worksheet" HorizontalAlignment="Center" VerticalAlignment="Center" Height="26" Width="110" ></Button>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>

                 <DataGridTextColumn Header="Veeps" width="Auto"></DataGridTextColumn>
                </DataGrid.Columns>

1 个答案:

答案 0 :(得分:1)

此处Canvas是一个问题。它从不试图扩大它的父母,这就是细胞不扩张的原因。

但是,它仍然是可视化树的一部分,还有其他元素具有更高的ZIndex。您可以尝试修复扩展器扩展时的ZIndex,但我相信这将需要太多的工作,并且会有很难找到并修复的错误。

我沿着“自定义控制”路线前进。构建一个继承自HeaderdContentControl的控件,并具有一个额外的属性:IsPopupShowing。内容将在弹出窗口中,并且将位于可视树之外。

实际上,它只能通过模板实现(尽管我仍然建议使用自定义控件)。像这样:

<Style x:Key="PoppingExpander" TargetType="{x:Type HeaderedContentControl}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type HeaderedContentControl}">
                <Grid>
                    <ToggleButton x:Name="HeaderHolder"
                                  Content="{TemplateBinding Header}"
                                  ContentTemplate="{TemplateBinding HeaderTemplate}"
                                  ContentTemplateSelector="{TemplateBinding HeaderTemplateSelector}"
                                  ContentStringFormat="{TemplateBinding HeaderStringFormat}"/>
                    <Popup x:Name="ContentHolder"
                           Placement="Bottom">
                        <Border Background="Aqua"
                                BorderBrush="LightBlue"
                                BorderThickness="1">
                            <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                              VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                              Margin="{TemplateBiding Padding}" />
                        </Border>
                    </Popup>
                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger SourceName="HeaderHolder" Property="IsChecked" Value="True">
                        <Setter TargetName="ContentHolder" Property="IsOpen" Value="True"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

[我可以将弹出窗口的IsOpen属性绑定到切换按钮的IsChecked属性,但我真的不喜欢使用ElementName语法,因为它的范围非常特别并创建非常难以捕获的错误。我更喜欢任何ElementName]

之外的其他方式

这会给你一个HeaderedContentControl,它在弹出窗口中有内容。您需要将切换按钮的样式设置为与扩展器中使用的样式相似(您可以通过混合提取扩展器的样式,它将具有按钮的样式)。

将您对Expander的使用更改为HeaderedContentControl,删除特定于Expander的属性集(例如IsExpanded),您就应该完成。

P.S。 - 如果您希望它以另一个方向打开,您可以更改弹出窗口的Placement属性。