WPF DataGrid 同步列宽

标签 wpf binding datagrid width datagridcolumn

我有两个 WPF 工具包 DataGrids ,我希望当用户调整第一个网格中第一列的大小时,它会调整第二个网格中第一列的大小。我试过绑定(bind) DataGridColumn 的宽度在第二个网格到第一个网格中的相应列,但它不起作用。我更喜欢使用所有 xaml,但我也可以使用后面的代码。

<tk:DataGrid Width="100" Height="100">
    <tk:DataGrid.Columns>
        <tk:DataGridTextColumn x:Name="Column1" Width="50"/>
    </tk:DataGrid.Columns>
</tk:DataGrid>
<tk:DataGrid Width="100" Height="100">
    <tk:DataGrid.Columns>
        <tk:DataGridTextColumn x:Name="Column1Copy" Width="{Binding Path=ActualWidth, ElementName=Column1}"/>
    </tk:DataGrid.Columns>
</tk:DataGrid>

我也尝试绑定(bind)到 Width而不是 ActualWidth ,但两者都不起作用。

任何帮助是极大的赞赏。

最佳答案

受上述艾哈迈德回答的启发,我使用附加行为快速解决了这个问题。

public class DataGridWidthSyncronizerBehavior
{
    public static readonly DependencyProperty SyncronizeWidthWithProperty =
        DependencyProperty.RegisterAttached("SyncronizeWidthWith",
            typeof(DataGrid),
            typeof(DataGridWidthSyncronizerBehavior),
            new UIPropertyMetadata(null, SyncronizeWidthWithChanged));

    public static void SetSyncronizeWidthWith(DependencyObject target, DataGrid value)
    {
        target.SetValue(SyncronizeWidthWithProperty, value);
    }

    public static DataGrid GetSyncronizeWidthWith(DependencyObject target)
    {
        return (DataGrid)target.GetValue(SyncronizeWidthWithProperty);
    }

    private static void SyncronizeWidthWithChanged(DependencyObject obj, DependencyPropertyChangedEventArgs dpargs)
    {
        if (!(obj is DataGrid sourceDataGrid))
            return;

        if (!(sourceDataGrid.GetValue(SyncronizeWidthWithProperty) is DataGrid targetDataGrid))
            return;

        void Handler(object sender, EventArgs e)
        {
            for (var i = 0; i < sourceDataGrid.Columns.Count && i < targetDataGrid.Columns.Count; ++i)
                targetDataGrid.Columns[i].Width = sourceDataGrid.Columns[i].ActualWidth;
        }

        sourceDataGrid.LayoutUpdated -= Handler;
        sourceDataGrid.LayoutUpdated += Handler;
    }
}

XAML:
<DataGrid local:DataGridWidthSyncronizerBehavior.SyncronizeWidthWith="{Binding ElementName=SyncronizedHeaderGrid}">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Header 1" 
                            Binding="{Binding Item1}" />
        <DataGridTextColumn Header="Header 2" 
                            Binding="{Binding Item2}"/>
        <DataGridTextColumn Header="Header 3" 
                            Binding="{Binding Item3}"/>
    </DataGrid.Columns>
</DataGrid>

<DataGrid x:Name="SyncronizedHeaderGrid">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Header 1" 
                            Binding="{Binding Item1}" />
        <DataGridTextColumn Header="Header 2" 
                            Binding="{Binding Item2}"/>
        <DataGridTextColumn Header="Header 3" 
                            Binding="{Binding Item3}"/>
    </DataGrid.Columns>
</DataGrid>

第二个 DataGrids,标题和单元格宽度,现在与第一个网格标题宽度同步。

关于WPF DataGrid 同步列宽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/414310/

相关文章:

c# - 将本地数据库放在 Visual Studio 解决方案中的什么位置?

wpf - 如何阻止IDataErrorInfo触发新项目?

wpf - Tablet PC/WPF 文本框错误 - 任何解决方法?

WPF 通过元素名称将属性绑定(bind)到另一个元素属性

c# - DataGrid 中的可见行减少 1(使用 ContainerFromItem 计算)

c# - 通过 TemplateBinding 添加 RoutedEvent

jquery - 当绑定(bind)到焦点输入并单击时,防止函数触发两次

c# - WPF Datagrid 不显示查询结果,甚至其绑定(bind)

c# - WPF Datagrid 单击行打开新页面

wpf - Caliburn Micro Bindablecollection - 绑定(bind)到组合框项目源显示错误的文本