2011-07-28 47 views
1

我正在编写一个控件以在窗体中显示和编辑对象。控件(FormDataView)是ItemsControl,其中每个项目是由Grid组成的FormField控件,其中字段名称位于左列,编辑器(例如TextBox)位于右列。为了对齐编辑器,我希望每个Grid中的第一列共享相同的宽度。在ItemsControl的项目中的网格之间共享列宽度

所以我尝试使用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是如何在FormDataViewItemsPanel设置,而SharedSizeGroup中的FormField模板中设置。这正确地表达了我想要做的事情:每个FormField应为第一列使用相同的宽度。然而,根据documentationSharedSizeGroup财产,不支持此方案:如果您在资源模板中设置IsSharedSizeScope为true 大小共享

电网不工作,你定义SharedSizeGroup作为外 该模板。

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

有什么想法?

注:我不想一个固定的宽度分配过程的第一列...

+1

你为什么不只是使用一个GridView(有列列表视图)? –

+1

@Wallstreet程序员,我可以尝试一下,如果我找到隐藏列标题的方法......但我更喜欢基于Grid的干净解决方案。使用GridView似乎是为我的需要矫枉过正 –

回答

3

可悲的是我有我的Visual Studio环境没有访问,所以我不可能检查下面的提示.. 。

  1. 分配Grid.IsSharedSizeScope="True"FormDataView本身,而不是到ItemsPanel。你真的需要StackPanel作为项目面板?你不能没有这种生活?

看看上面的变化工作第一...

  1. 如果没有的话你的改造项目级别代码,并在你的FormDataView你的项目数据模板个人FormFieldControlTemplate分配​​不能及的。

让我知道,如果这有助于....

+0

选项1正常工作,非常感谢! –