gpt4 book ai didi

c# - 将 DataGrid 列宽绑定(bind)到另一个 DataGrid 的两列

转载 作者:行者123 更新时间:2023-11-30 17:31:30 26 4
gpt4 key购买 nike

问题:我如何绑定(bind)StatName.WidthSamp1.ActualWidth + Samp2.ActualWidth

Current vs desired

子问题:

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

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

我尝试过的:

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

我曾尝试将各种在线示例组合成一个解决方案。我似乎无法将它们整合在一起。

编辑

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

  1. 没有构建错误或警告。
  2. Convert功能未命中
  3. 输出中没有相关信息

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

  1. 构建错误(仍然允许执行):指定的转换无效。对于 <MultiBinding>...</MultiBinding> .
  2. Convert加载时被调用三次。调整大小时不调用专栏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')


MultiBinding 尝试(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>

MultiBinding Attempt(代码部分)

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);

Converter在加载和调整大小时被调用 Samp1Samp2 .列宽按预期保持同步。

<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>

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);
}

注意:代码按预期执行,不管错误 Specified cast is not valid.

  1. Visual Studio 设计器在整个标记下划线 <MultiBinding ... </MultiBinding>青色。
  2. 错误列表 窗口报告错误“指定的转换无效。”
  3. 虽然显示为错误,但 Visual Studio 仍会构建并执行代码。

关于c# - 将 DataGrid 列宽绑定(bind)到另一个 DataGrid 的两列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47762162/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com