在ItemsControl的项目中的网格之间共享列宽

时间:2011-07-28 10:32:48

标签: wpf grid sharedsizegroup

我正在编写一个控件来显示和编辑表单中的对象。控件(FormDataView)是ItemsControl,其中每个项目都是由FormField组成的Grid控件,左侧列中的字段名称和编辑器(例如TextBox) )在右栏中。为了对齐编辑器,我希望每个Grid中的第一列共享相同的宽度。

所以我尝试使用IsSharedSizeScopeSharedSizeGroup,但它不起作用,第一列在每个FormField中的宽度不同。

以下是这些控件的样式:

<Style TargetType="{x:Type ctl:FormDataView}" BasedOn="{StaticResource ResourceKey={x:Type ItemsControl}}">
    <Setter Property="ItemsPanel">
        <Setter.Value>
            <ItemsPanelTemplate>
                <StackPanel Orientation="Vertical"
                            Grid.IsSharedSizeScope="True"
                            IsItemsHost="True" />
            </ItemsPanelTemplate>
        </Setter.Value>
    </Setter>
</Style>

<Style TargetType="{x:Type ctl:FormField}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ctl:FormField}">
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto" SharedSizeGroup="headerColumn" />
                        <ColumnDefinition Width="*" />
                    </Grid.ColumnDefinitions>
                    <ContentPresenter Grid.Column="0"
                                      Content="{TemplateBinding Header}"
                                      Margin="3"
                                      TextElement.FontWeight="Bold" />
                    <ContentPresenter Grid.Column="1"
                                      Name="PART_Display"
                                      ContentTemplate="{TemplateBinding DisplayTemplate}"
                                      Margin="2"/>
                    <ContentPresenter Grid.Column="1"
                                      Name="PART_Editor"
                                      ContentTemplate="{TemplateBinding EditorTemplate}"
                                      Margin="2"
                                      Visibility="Collapsed" />
                </Grid>
                <ControlTemplate.Triggers>
                    <DataTrigger Binding="{Binding IsInEditMode, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ctl:FormDataView}}}"
                                 Value="True">
                        <Setter TargetName="PART_Display" Property="Visibility" Value="Collapsed" />
                        <Setter TargetName="PART_Editor" Property="Visibility" Value="Visible" />
                    </DataTrigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

请注意Grid.IsSharedSizeScope ItemsPanelFormDataView的设置方式SharedSizeGroup,而FormField模板中设置了FormField。这正确地表达了我想要做的事情:每个SharedSizeGroup应该对第一列使用相同的宽度。但是,根据{{1}}属性的documentation,不支持此方案:

  

如果将IsSharedSizeScope设置为true,则网格大小共享不起作用   在资源模板中,您将SharedSizeGroup定义为外部   那个模板。

好的,所以我可以理解为什么它不起作用......但我不知道如何解决这个限制。

有什么想法吗?

N.B。:我当然不希望为第一列指定固定宽度......

1 个答案:

答案 0 :(得分:3)

可悲的是,我无法访问我的Visual Studio环境,因此无法检查以下提示......

  1. Grid.IsSharedSizeScope="True"分配给FormDataView本身,而不是ItemsPanel。您真的需要StackPanel作为项目面板吗?你不能没有那个吗?
  2. 查看上述更改是否有效......

    1. 如果没有,则修改您的商品级代码,并在SharedSizeGroup="headerColumn"的商品数据模板中分配FormDataView,而不是ControlTemplate个人FormField
    2. 如果这有帮助,请告诉我....