2011-10-25 13 views
1

私は、次のコードを持って、それがリストボックスで選択した項目にcorressponding、項目を一覧表示し、データグリッドで構成されています。すべてが機能しますが、DataGrid Columnsの幅はwierdとして機能します。 "name"カラムの幅をstarに設定して、 "wert"カラムがその内容に必要なスペースをとり、 "name"カラムが残りを取るようにします。これは動作していますが、少し問題があります。アプリケーションが起動すると、すべての列が最小幅になり、ListBox内の別の項目を選択するだけで、列の幅が目的の値(「名前」のスター、「wert」の自動)に更新されます。 アプリケーションのロード時にDataGridのUpdateLayoutメソッドを使用しようとしましたが、それは役に立たなかった。DataGridの列幅(幅=「*」)は、「リフレッシュ」ではありません

また、私はパンダを使用しています、そして、すべてのパンダが閉じているとき、私は最初の項目のいずれかを展開し、幅が正確であるためには、リストボックス内の別の項目をロードする必要があります。

誰もが正しい方向に私を指すしてくださいもらえますか? :)

UPDATE:最初の質問は解決しますが、別の小さな問題があります: 列はもはや崩壊していないが、theyeはどちらか彼らの希望のサイズではありません。行の内容ではなく、ヘッダーの名前に合わせてサイズが調整されます。これは、エクスパンダがデフォルトで閉じられている場合にのみ発生します。エキスパンダーを展開するように設定すると、必要に応じてすべての列が内容の幅に設定されます。ここで

が使用するコードです:

<Grid.DataContext> 
      <XmlDataProvider x:Name="XmlData" Source="entries.xml" XPath="Root/Person" /> 
</Grid.DataContext> 

<ListBox Name="PersonListBox" 
       ItemsSource="{Binding}" 
       ItemTemplate="{StaticResource listBoxTemplate}" 
       IsSynchronizedWithCurrentItem="True" 
       Visibility="Visible" SelectionMode="Single" SelectedIndex="-1" DataContext="{Binding}"> 
      </ListBox> 

<DataGrid IsSynchronizedWithCurrentItem="True" Name="itemGrid" 
       DataContext="{Binding ElementName=PersonListBox, Path=SelectedItem}" 
       CanUserResizeColumns="False" 
       CanUserResizeRows="False" 
       IsReadOnly="true" 
       Background="White" 
       HorizontalScrollBarVisibility="Hidden" 
       AutoGenerateColumns="False"> 
       <DataGrid.Resources> 
        <CollectionViewSource x:Key="items" Source="{Binding XPath=item}"> 
         <CollectionViewSource.GroupDescriptions> 
          <PropertyGroupDescription PropertyName="@name"/> 
         </CollectionViewSource.GroupDescriptions> 
        </CollectionViewSource> 
       </DataGrid.Resources> 
       <DataGrid.ItemsSource> 
        <Binding Source="{StaticResource items}"/> 
       </DataGrid.ItemsSource> 
       <DataGrid.Columns> 
        <DataGridTextColumn Width="*" Header="Name" Binding="{Binding [email protected]}"/> 
        <DataGridTextColumn Header="Wert" Binding="{Binding [email protected], Converter={StaticResource sumConverter}}}"/> 
       </DataGrid.Columns> 
       <DataGrid.GroupStyle> 
        <GroupStyle> 
        <GroupStyle.ContainerStyle> 
         <Style TargetType="{x:Type GroupItem}"> 
          <Setter Property="Template"> 
           <Setter.Value> 
            <ControlTemplate TargetType="{x:Type GroupItem}"> 
             <Expander > 
              <Expander.Header> 
               <StackPanel Orientation="Horizontal"> 
                <TextBlock Text="{Binding Path=Name}" /> 
                <TextBlock Text="{Binding Path=Items, Converter={StaticResource sumConverter}}" /> 
               </StackPanel> 
              </Expander.Header> 
              <ItemsPresenter /> 
             </Expander> 
            </ControlTemplate> 
           </Setter.Value> 
          </Setter> 
         </Style> 
        </GroupStyle.ContainerStyle> 
       </GroupStyle> 
       </DataGrid.GroupStyle> 
      </DataGrid> 

答えて

11

私は答えに私を導いた、このpostを見つけました。要約すると、デフォルトのGroupStyle.Panel(StackPanel)はDataGrid幅 "*"に適合できないため、列が崩壊します。単に

<GroupStyle.Panel> 
    <ItemsPanelTemplate> 
     <DataGridRowsPresenter/> 
    </ItemsPanelTemplate>    
</GroupStyle.Panel> 

GroupStyleに追加するだけでよいはずです。

+0

作品。ありがとうございました:) – ch40s

+0

更新された質問^^ – ch40s

+0

"*"ではなく "Auto"に列の幅を設定しようとしましたか? – philt5252

関連する問題