亲爱的 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>