wpf - 将 DataGridColumn 的 Width 属性绑定(bind)到父 DataGrid 的 ActualWidth

标签 wpf binding datagrid width actualwidth

我试图解决我之前的question手动绑定(bind) DataGridTextColumnWidth 属性,这是我的 XAML 代码的第一个版本。

   <DataGrid AutoGenerateColumns="False" Background="White" ItemsSource="{Binding Items, Mode=OneWay}" 
              HorizontalGridLinesBrush="Silver" VerticalGridLinesBrush="Silver"
              Margin="332,10,10,10" CanUserAddRows="False" CanUserDeleteRows="False"
              x:Name="myDataGrid" ColumnWidth="*">
        <DataGrid.Columns>
            <DataGridTextColumn Width="{Binding Path=ActualWidth, Converter={StaticResource ResourceKey=WidthValueConverter}, RelativeSource={RelativeSource AncestorType=DataGrid}}" IsReadOnly="True" Header="Column1" Binding="{Binding Value1, Mode=OneWay}" />
            <DataGridTextColumn Width="{Binding Path=ActualWidth, Converter={StaticResource ResourceKey=WidthValueConverter}, RelativeSource={RelativeSource AncestorType=DataGrid}}" IsReadOnly="True" Header="Column2" Binding="{Binding Value2, Mode=OneWay}"/>
            <DataGridTextColumn Width="{Binding Path=ActualWidth, Converter={StaticResource ResourceKey=WidthValueConverter}, RelativeSource={RelativeSource AncestorType=DataGrid}}" IsReadOnly="True" Header="Column3" Binding="{Binding Value3, Mode=OneWay}"/>
        </DataGrid.Columns>
    </DataGrid>

经过一番研究,我发现了这个 post这似乎为我的问题提供了答案,我更新了我的 DataGrid 代码。

   <DataGrid AutoGenerateColumns="False" Background="White" ItemsSource="{Binding Items, Mode=OneWay}" 
              HorizontalGridLinesBrush="Silver" VerticalGridLinesBrush="Silver"
              Margin="332,10,10,10" CanUserAddRows="False" CanUserDeleteRows="False"
              x:Name="myDataGrid" ColumnWidth="*">
        <DataGrid.Columns>
            <DataGridTextColumn Width="{Binding Path=ActualWidth, Converter={StaticResource ResourceKey=WidthValueConverter}, Source={x:Reference Name=myDataGrid}}" IsReadOnly="True" Header="Column1" Binding="{Binding Value1, Mode=OneWay}" />
            <DataGridTextColumn Width="{Binding Path=ActualWidth, Converter={StaticResource ResourceKey=WidthValueConverter}, Source={x:Reference Name=myDataGrid}}" IsReadOnly="True" Header="Column2" Binding="{Binding Value2, Mode=OneWay}"/>
            <DataGridTextColumn Width="{Binding Path=ActualWidth, Converter={StaticResource ResourceKey=WidthValueConverter}, Source={x:Reference Name=myDataGrid}}" IsReadOnly="True" Header="Column3" Binding="{Binding Value3, Mode=OneWay}"/>
        </DataGrid.Columns>
    </DataGrid>

但现在我得到了这个 XamlParseException

Cannot call MarkupExtension.ProvideValue because of a cyclical dependency. Properties inside a 
MarkupExtension cannot reference objects that reference the result of the MarkupExtension. 
The affected MarkupExtensions are:
'System.Windows.Data.Binding' Line number '37' and line position '37'.
'System.Windows.Data.Binding' Line number '38' and line position '37'.
'System.Windows.Data.Binding' Line number '39' and line position '37'.

那么我如何将DataGridColumnWidth属性绑定(bind)到其父DataGridActualWidth属性

最佳答案

遇到了同样的问题,发现使用 x:Reference 无法引用正在使用它的对象的任何容器。 令人讨厌的黑客,但我想如果您创建了一些其他控件(TextBlock)并将其宽度绑定(bind)到DataGrid ActualWidth然后使用x :引用 TextBlock 可以避免循环引用

<TextBlock x:Name="TextBlock1" Width="{Binding ElementName=myDataGrid, Path=ActualWidth}" />
<DataGrid AutoGenerateColumns="False" Background="White" ItemsSource="{Binding Items, Mode=OneWay}" 
          HorizontalGridLinesBrush="Silver" VerticalGridLinesBrush="Silver"
          Margin="332,10,10,10" CanUserAddRows="False" CanUserDeleteRows="False"
          x:Name="myDataGrid" ColumnWidth="*">
        <DataGrid.Columns>
            <DataGridTextColumn Width="{Binding Path=ActualWidth, Converter={StaticResource ResourceKey=WidthValueConverter}, Source={x:Reference Name=TextBlock1}}" IsReadOnly="True" Header="Column1" Binding="{Binding Value1, Mode=OneWay}" />
            <DataGridTextColumn Width="{Binding Path=ActualWidth, Converter={StaticResource ResourceKey=WidthValueConverter}, Source={x:Reference Name=TextBlock1}}" IsReadOnly="True" Header="Column2" Binding="{Binding Value2, Mode=OneWay}"/>
            <DataGridTextColumn Width="{Binding Path=ActualWidth, Converter={StaticResource ResourceKey=WidthValueConverter}, Source={x:Reference Name=TextBlock1}}" IsReadOnly="True" Header="Column3" Binding="{Binding Value3, Mode=OneWay}"/>
        </DataGrid.Columns>
</DataGrid>

关于wpf - 将 DataGridColumn 的 Width 属性绑定(bind)到父 DataGrid 的 ActualWidth,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12871551/

相关文章:

c# - WPF ComboBox 绑定(bind)未正确更新

css - 在 asp.net 中跨多个页面打印具有许多列标题的 Datagrid 表

wpf - RowVirtualization 导致行的背景颜色不正确

wpf - 从框架内关闭 wpf 窗口

wpf - 如何在 WPF 中设置按钮上的文本?

c# - 为什么我需要一个评估者而不是直接从我的绑定(bind)对象数据属性中获取我的值

cocoa - NSPopupButton 单元格绑定(bind)问题

c# - 拖放时如何删除虚线矩形

c# - WPF 字符串数组 - 绑定(bind)到资源

c# - WPF 数据网格在文本更改时更改颜色