问题:如何将StatName.Width
绑定到Samp1.ActualWidth + Samp2.ActualWidth
?
子问题:
为什么我的WidthConverter
函数从不执行(断点从不命中)?
各个MultiBinding组件的正确<Binding ...
语法是什么?
我试过的
我想我需要为DataGridTextColumn.Width
分配MultiBinding
和某种类型的转换器。
我尝试过在线收集各种示例的解决方案。我似乎无法将所有内容整合在一起。
编辑
使用<Binding ElementName="Samp1" Path="ActualWidth" />
没有构建错误或警告。Convert
功能未命中
输出中没有相关消息
使用<Binding Source="{x:Reference Samp1}" Path="ActualWidth" />
生成错误(仍然允许执行):指定的强制转换无效。对于<MultiBinding>...</MultiBinding>
。Convert
在加载时被调用3次。调整大小时不调用
列Samp1
。
每次执行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);
Converter
在加载时以及调整Samp1
或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>
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.
如何,代码均按预期执行Visual Studio设计器在整个标记
<MultiBinding ... </MultiBinding>
下加了青色。错误列表窗口报告错误“指定的转换无效。”
当它显示为错误时,Visual Studio仍将生成并执行代码。
关于c# - 将DataGrid列宽绑定(bind)到另一个DataGrid的两列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47762162/