C# 动态对齐WPF DataGrid列的宽度

C# 动态对齐WPF DataGrid列的宽度,c#,wpf,mvvm,datagrid,C#,Wpf,Mvvm,Datagrid,有一个WPFDataGrid,具有在Ctrl+MouseWheel事件中动态更改FontSize的功能。 它是使用Caliburn的cal:Message.Attach功能实现的: <!-- xaml --> cal:Message.Attach="[Event PreviewMouseWheel] = [Action ChangeDataGridFont($eventArgs)]" DataGridFontSize是绑定到DataGrid的CellStyle的VM属性 加载时,列

有一个WPF
DataGrid
,具有在Ctrl+MouseWheel事件中动态更改
FontSize
的功能。
它是使用Caliburn的cal:Message.Attach功能实现的:

<!-- xaml -->
cal:Message.Attach="[Event PreviewMouseWheel] = [Action ChangeDataGridFont($eventArgs)]"
DataGridFontSize
是绑定到
DataGrid
CellStyle
的VM属性

加载时,列的宽度与内容对齐-确定:

如果用户增加字体大小,则自动调整列宽-确定:

但是,当字体大小减小时,不会调整列。请参见空白:

有没有办法克服这种影响(如果可能,在MvvM的范围内)

更新:看起来我们需要在更改
FontSize
时手动更新列宽。我可以用相应的样式绑定列的宽度:

<Style x:Key="IdCellStyle" TargetType="{x:Type DataGridCell}" >
    <Setter Property="Width" Value="{Binding DataContext.ColWidth, Mode=TwoWay, 
                                    RelativeSource={RelativeSource AncestorType=UserControl}}" />
    ....
</Style>

DataGridFontSize
setter中,我应该将
ColWidth
设置为什么?

我刚刚为
DataGridColumn
添加了
Width
,看起来效果不错。试试看



我看到的是,在您的示例中,所有列的宽度都是固定的。而且在开始时,您没有根据内容调整列。另外:当您最终放大时,“Papineau”不适合列中。@IgorStack如前所述,您可以将宽度固定为您想要的任何大小。我只是把
*
放进去,让
DataGrid
将所有列扩展到最大值。现在您知道了当您更新字体大小时,也要在代码中更新宽度以使其正常工作。我的观点是,当鼠标滚动时,必须手动调整宽度。希望这有帮助
<Style x:Key="IdCellStyle" TargetType="{x:Type DataGridCell}" >
    <Setter Property="Width" Value="{Binding DataContext.ColWidth, Mode=TwoWay, 
                                    RelativeSource={RelativeSource AncestorType=UserControl}}" />
    ....
</Style>
public double ColWidth
{
    get => _colWidth;
    set
    {
        _colWidth = value;
        NotifyOfPropertyChange();
    }
}
<Window.Resources>
    <XmlDataProvider x:Key="MockList"   XPath="/MockObjects/*" >
        <x:XData >
            <MockObjects xmlns="">
                <MockObject  Name="Louis" Type="TTTT" Number="1" />
                <MockObject Name="Joseph" Type="TTTT" Number="2" />
                <MockObject Name="Papineau" Type="ZZZZ" Number="3" />
            </MockObjects>
        </x:XData>
    </XmlDataProvider>
</Window.Resources>
<Grid DataContext="{Binding Source={StaticResource MockList}}" >
    <DataGrid HorizontalAlignment="Stretch" Margin="10" VerticalAlignment="Stretch" 
              ItemsSource="{Binding Mode=Default, XPath=/MockObjects/MockObject}" 
              AutoGenerateColumns="False" PreviewMouseWheel="UIElement_OnPreviewMouseWheel">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Name" Binding="{Binding XPath=@Name}" Width="*"></DataGridTextColumn>
            <DataGridTextColumn Header="Type" Binding="{Binding XPath=@Type}" Width="*"></DataGridTextColumn>
            <DataGridTextColumn Header="Number" Binding="{Binding XPath=@Number}" Width="*"></DataGridTextColumn>
        </DataGrid.Columns>
    </DataGrid>
</Grid>