2011-07-28 74 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正常工作,非常感謝! –