将 DataGrid 列宽度绑定到另一个 DataGrid 的两列

2023-11-30

问题:我该如何绑定StatName.Width to Samp1.ActualWidth + Samp2.ActualWidth?

Current vs desired

子问题:

为什么是我的WidthConverter函数从未执行(断点从未命中)?

什么是正确的<Binding ...各个 MultiBinding 组件的语法?

我尝试过的:

我想我需要分配DataGridTextColumn.Width with MultiBinding和某种类型的转换器。

我尝试从网上的各种示例中整理出一个解决方案。我似乎无法把这一切整合在一起。

EDIT

与使用<Binding ElementName="Samp1" Path="ActualWidth" />

  1. 没有构建错误或警告。
  2. The Convert函数未命中
  3. 输出中没有相关消息

与使用<Binding Source="{x:Reference Samp1}" Path="ActualWidth" />

  1. 构建错误(仍然允许执行):指定的强制转换无效。为了<MultiBinding>...</MultiBinding>.
  2. Convert加载时调用3次。调整大小时不会调用它 柱子Samp1.
  3. 每次执行时Convert:

System.Windows.Data Error: 5 : Value produced by BindingExpression is not valid for target property.; Value='40' MultiBindingExpression:target element is 'DataGridTextColumn' (HashCode=64879470); target property is 'Width' (type 'DataGridLength')


多重绑定尝试(xaml 部分)

<Page.Resources>
    <local:WidthConverter x:Key="WidthConverter" />
</Page.Resources>

<StackPanel>

    <DataGrid IsReadOnly="True" HeadersVisibility="Column">
        <DataGrid.Columns>
            <DataGridTextColumn x:Name="Samp1" Binding="{Binding a}" Header="S1" />
            <DataGridTextColumn x:Name="Samp2" Binding="{Binding b}" Header="S2" />
            <DataGridTextColumn x:Name="Total" Binding="{Binding c}" Header="Tot" />
        </DataGrid.Columns>
        <local:MyGenericRecord a="5000" b="2500" c="7500" />
        <local:MyGenericRecord a="1000" b="1500" c="2500" />
    </DataGrid>

    <DataGrid IsReadOnly="True" HeadersVisibility="Column">
        <DataGrid.Columns>
            <DataGridTextColumn x:Name="StatName"  Binding="{Binding a}" Header="Stat">
                <DataGridTextColumn.Width>
                    <MultiBinding Converter="{StaticResource WidthConverter}">
                        <Binding ElementName="Samp1" Path="ActualWidth" />
                        <Binding ElementName="Samp2" Path="ActualWidth" />
                    </MultiBinding>
                </DataGridTextColumn.Width>
            </DataGridTextColumn>
            <DataGridTextColumn x:Name="StatValue" Binding="{Binding b}" Header="Val" Width="{Binding ElementName=Total, Path=ActualWidth}" />
        </DataGrid.Columns>
        <local:MyGenericRecord a="Min" b="2500" />
        <local:MyGenericRecord a="Max" b="7500" />
        <local:MyGenericRecord a="Average" b="5000" />
    </DataGrid>

</StackPanel>

多重绑定尝试(代码部分)

public class WidthConverter : IMultiValueConverter
{

    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        double totalWidth = 0;

        foreach (DataGridLength Width in values)
            totalWidth += Width.Value;

        return totalWidth;
    }
    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        return null;
    }
}

代码最终按预期执行,如下所示:

  • <Binding Source="{x:Reference Samp2}" Path="ActualWidth" />
  • return new DataGridLength(totalWidth);

The Converter在加载和调整大小时被调用Samp1 or Samp2。列宽按预期保持同步。

<DataGridTextColumn x:Name="StatName"  Binding="{Binding a}" Header="Stat">
   <DataGridTextColumn.Width >
       <MultiBinding Converter="{StaticResource WidthConverter}">
           <Binding Source="{x:Reference Samp1}" Path="ActualWidth" />
           <Binding Source="{x:Reference Samp2}" Path="ActualWidth" />
       </MultiBinding>
   </DataGridTextColumn.Width>
</DataGridTextColumn>

The Convert需要返回一个函数DataGridLength,数据类型DataGridTextColumn.Width.

public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{

    double totalWidth = 0;

    foreach (double Width in values)
        totalWidth += Width;

    return new DataGridLength(totalWidth);
}

Note:无论错误如何,代码都会按预期执行Specified cast is not valid.

  1. Visual Studio 设计器为整个标记添加下划线<MultiBinding ... </MultiBinding>青色。
  2. The 错误列表窗口报告错误“指定的转换无效。”
  3. 虽然它显示为错误,但 Visual Studio 仍将生成并执行代码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 DataGrid 列宽度绑定到另一个 DataGrid 的两列 的相关文章

随机推荐