将数据添加到 DataGrid 对象后,不会重新调整列

时间:2021-04-05 09:47:06

标签: wpf datagrid

亲爱的 Stack Overflow 会员

我只是希望有人能将我的注意力引向以下问题的根本原因。

我正在使用 MVVM 来显示一些业务数据。在来自服务器的响应之后,数据被重新排列并填充 DataGrid 对象。但是,有时,DataGrid 的列不会根据内容重新调整自己。请找到附件截图。有趣的是,它发生在一个蓝色的月亮,但我想修复。一百万感谢大家提供的帮助。

The difference between what happens and what is expected

    <UserControl x:Class="Fohlio.RevitReportsIntegration.Views.AreaControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:Fohlio.RevitReportsIntegration.Views"
             xmlns:Custom="http://schemas.microsoft.com/netfx/2009/xaml/presentation"
             xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
             xmlns:p="clr-namespace:Fohlio.RevitReportsIntegration.Properties"
             xmlns:cnt="clr-namespace:Fohlio.RevitReportsIntegration.Controls"
             xmlns:dgx="urn:tom-englert.de/DataGridExtensions"
             xmlns:vm="clr-namespace:Fohlio.RevitReportsIntegration.ViewModel"
             Style="{DynamicResource UserControlDialogStyle}"
             DataContext="{Binding Source={x:Static vm:AreaViewModel.Instance}}">

  <UserControl.Resources>
    <ResourceDictionary>
      <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="Resources/Styles.xaml" />
        <ResourceDictionary Source="Resources/CheckBoxStyle.xaml"/>
        <ResourceDictionary Source="Resources/ComboBoxStyle.xaml"/>
        <ResourceDictionary Source="Resources/DataGridStyle.xaml"/>
        <ResourceDictionary Source="Resources/DataGridComboBoxStyle.xaml" />
      </ResourceDictionary.MergedDictionaries>

      <CollectionViewSource x:Key="GroupableAreaModels" Source="{Binding AreaModels,
                                                       Mode=TwoWay, 
                                                       UpdateSourceTrigger=PropertyChanged}">
        <CollectionViewSource.GroupDescriptions>
          <PropertyGroupDescription PropertyName="Category.Name" />
        </CollectionViewSource.GroupDescriptions>
      </CollectionViewSource>

      <ControlTemplate x:Key="SearchDGFilter">
        <cnt:SearchDGFilter Filter="{Binding Path=Filter,
                                    RelativeSource={RelativeSource 
                                    Mode=FindAncestor, 
                                    AncestorType=dgx:DataGridFilterColumnControl}}"/>
      </ControlTemplate>

      <DataTemplate x:Key="ComboboxColumnTemplate">
        <ComboBox SelectedValuePath="Id" DisplayMemberPath="Name"
                  IsEditable="True" HorizontalAlignment="Stretch">
          <ComboBox.Style>
            <Style TargetType="{x:Type ComboBox}"
                   BasedOn="{StaticResource DGComboboxStyle}">
              <Setter Property="SelectedItem" Value="{Binding FohlioLayer, Mode=OneWay,
                                                     UpdateSourceTrigger=PropertyChanged}" />
              <Setter Property="ItemsSource" 
                      Value="{Binding FilteredAreas, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
              <Setter Property="SelectedItem"
                      Value="{Binding FohlioArea, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
              <Setter Property="ItemContainerStyle">
                <Setter.Value>
                  <Style TargetType="ComboBoxItem" BasedOn="{StaticResource {x:Type ComboBoxItem}}">
                    <Style.Triggers>
                      <DataTrigger Binding="{Binding IsVisible,
                                            Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Value="False">
                        <Setter Property="Visibility" Value="Collapsed" />
                      </DataTrigger>
                    </Style.Triggers>
                  </Style>
                </Setter.Value>
              </Setter>
            </Style>
          </ComboBox.Style>
        </ComboBox>
      </DataTemplate>

      <DataTemplate x:Key="QtyBindedColumnTemplate">
        <CheckBox HorizontalAlignment="Center"
                  IsChecked="{Binding IsSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
          <i:Interaction.Triggers>
            <i:EventTrigger EventName="Checked">
              <i:InvokeCommandAction Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}},
                                              Path=DataContext.SelectItemCommand}" CommandParameter="{Binding}" />
            </i:EventTrigger>
            <i:EventTrigger EventName="Unchecked">
              <i:InvokeCommandAction Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}},
                                              Path=DataContext.DeselectItemCommand}" CommandParameter="{Binding}" />
            </i:EventTrigger>
          </i:Interaction.Triggers>
        </CheckBox>
      </DataTemplate>
      <DataTemplate x:Key="BindedColumnTemplate">
        <TextBlock Text="{Binding Name}"/>
      </DataTemplate>
    </ResourceDictionary>
  </UserControl.Resources>

  <Grid Margin="20,0" VerticalAlignment="Stretch">
    <Grid.RowDefinitions>
      <RowDefinition Height="*" />
      <RowDefinition Height="40" />
      <RowDefinition Height="90" />
    </Grid.RowDefinitions>
      <DataGrid x:Name="dataGrid" ItemsSource="{Binding Source={StaticResource GroupableAreaModels}}"
                CanUserSortColumns="False"
                CanUserAddRows="False"
                AutoGenerateColumns="False"
                Width="Auto"
                HorizontalAlignment="Stretch" VerticalAlignment="Top" Height="Auto"
                dgx:DataGridFilter.IsAutoFilterEnabled="True" RowHeaderWidth="0"
                GridLinesVisibility="None" ScrollViewer.CanContentScroll="False">
        
        <DataGrid.GroupStyle>
          <GroupStyle>
            <GroupStyle.ContainerStyle>
              <Style TargetType="{x:Type GroupItem}">
                <Setter Property="Template">
                  <Setter.Value>
                    <ControlTemplate TargetType="{x:Type GroupItem}">
                      <Expander IsExpanded="True">
                        <Expander.Header>
                          <DockPanel>
                            <CheckBox>
                              <i:Interaction.Triggers>
                                <i:EventTrigger EventName="Checked">
                                  <i:InvokeCommandAction
                                      Command="{Binding
                                               RelativeSource={
                                               RelativeSource FindAncestor, AncestorType={x:Type UserControl}},
                                               Path=DataContext.SelectGroupCommand}" CommandParameter="{Binding}" />
                                </i:EventTrigger>
                                <i:EventTrigger EventName="Unchecked">
                                  <i:InvokeCommandAction
                                      Command="{Binding RelativeSource={
                                               RelativeSource FindAncestor, AncestorType={x:Type UserControl}},
                                               Path=DataContext.DeselectGroupCommand}" CommandParameter="{Binding}" />
                                </i:EventTrigger>
                              </i:Interaction.Triggers>
                              <StackPanel>
                                <TextBlock Text="{Binding Path=Name}" Margin="5,0,0,0" Width="85"/>
                              </StackPanel>
                            </CheckBox>
                          </DockPanel>
                        </Expander.Header>
                        <Expander.Content>
                          <ItemsPresenter />
                        </Expander.Content>
                      </Expander>
                    </ControlTemplate>
                  </Setter.Value>
                </Setter>
              </Style>
            </GroupStyle.ContainerStyle>
          </GroupStyle>
        </DataGrid.GroupStyle>
        
        <DataGrid.Columns>
          <Custom:DataGridTemplateColumn Header="{x:Static p:Resources.export}" Width="Auto" >
            <Custom:DataGridTemplateColumn.HeaderTemplate>
              <DataTemplate>
                <StackPanel Orientation="Horizontal">
                  <TextBlock Text="Export" Margin="0 0 3 0" />
                  <CheckBox HorizontalAlignment="Center" VerticalAlignment="Center">
                    <i:Interaction.Triggers>
                      <i:EventTrigger EventName="Checked">
                        <i:InvokeCommandAction Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}},
                                                        Path=DataContext.SelectAllCommand}" CommandParameter="true" />
                      </i:EventTrigger>
                      <i:EventTrigger EventName="Unchecked">
                        <i:InvokeCommandAction Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}},
                                                        Path=DataContext.SelectAllCommand}" CommandParameter="false" />
                      </i:EventTrigger>
                    </i:Interaction.Triggers>
                  </CheckBox>
                </StackPanel>
              </DataTemplate>
            </Custom:DataGridTemplateColumn.HeaderTemplate>
            <Custom:DataGridTemplateColumn.CellTemplate >
              <DataTemplate>
                <ContentPresenter x:Name="schemaContentPresenter"
                                  ContentTemplate="{StaticResource QtyBindedColumnTemplate}"
                                  Content="{TemplateBinding Content}" />

              </DataTemplate>
            </Custom:DataGridTemplateColumn.CellTemplate>
          </Custom:DataGridTemplateColumn>
          <Custom:DataGridTemplateColumn Header="{x:Static p:Resources.div_RevitRegions}"
                                         Width="*" SortMemberPath="Name"
                                         dgx:DataGridFilterColumn.Template="{StaticResource SearchDGFilter}">
            <Custom:DataGridTemplateColumn.CellTemplate >
              <DataTemplate>
                <ContentPresenter x:Name="schemaContentPresenter"
                                  ContentTemplate="{StaticResource BindedColumnTemplate}"
                                  Content="{TemplateBinding Content}" />
              </DataTemplate>
            </Custom:DataGridTemplateColumn.CellTemplate>
          </Custom:DataGridTemplateColumn>
          <Custom:DataGridTemplateColumn Header="{x:Static p:Resources.div_FohlioAreas}"
                                         Width="*"
                                         dgx:DataGridFilterColumn.Template="{StaticResource SearchDGFilter}" SortMemberPath="FohlioArea.Name">
            <Custom:DataGridTemplateColumn.CellTemplate >
              <DataTemplate>

                  <StackPanel>
                    <ComboBox x:Name="FohlioAreas"
                              ItemsSource="{Binding DataContext.FilteredAreas,
                                           RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"
                              SelectedValuePath="Id" DisplayMemberPath="Name" IsEditable="True"
                              SelectedItem="{Binding FohlioArea, Mode=TwoWay,
                                            UpdateSourceTrigger=PropertyChanged}"
                              HorizontalAlignment="Stretch" Style="{StaticResource DGComboboxStyle}" />
                  </StackPanel>
              </DataTemplate>
            </Custom:DataGridTemplateColumn.CellTemplate>
          </Custom:DataGridTemplateColumn>
        </DataGrid.Columns>
      </DataGrid>

      <StackPanel Grid.Row="2" Margin="0,10,0,5" HorizontalAlignment="Right" Orientation="Horizontal">
          <cnt:BackControl />
          <Button Content="{x:Static p:Resources.Continue}" Width="140"
              Command="{Binding DataContext.NextCommand,
                       RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" />
          </StackPanel>
        </Grid>
    </UserControl>

0 个答案:

没有答案
相关问题