问题: 如何将StatName.Width
绑定到Samp1.ActualWidth + Samp2.ActualWidth
?
子问题:
为什么我的WidthConverter
函数从未执行(断点从未被触发)?
哪种方法是正确的<Binding ...
语法用于每个MultiBinding组件?
我尝试过的:
我认为我需要使用MultiBinding
和某种类型的转换器对DataGridTextColumn.Width
进行赋值。
我已经尝试从各种在线示例中组合解决方案。 我似乎无法将它们全部整合在一起。
编辑
使用<Binding ElementName="Samp1" Path="ActualWidth" />
- 没有编译错误或警告。
Convert
函数没有被触发- 输出中没有相关消息
使用<Binding Source="{x:Reference Samp1}" Path="ActualWidth" />
- 编译错误(仍然允许执行):指定的强制转换无效。对于
<MultiBinding>...</MultiBinding>
。 - 重设大小时无法调用
Convert
,但加载时会被调用三次。 - 在每次执行
Convert:
时:
System.Windows.Data Error: 5 : BindingExpression产生的值不适用于目标属性; 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>
多绑定尝试(代码部分)
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;
}
}
ActualWidth
不是一个double
吗?我尝试将DataGridLength
改为double
,它可以工作。 - P.Mantheforeach ( double Width in values ) totalWidth += Width;
。代码编译并运行了,但是“StatName”列仍然只有单词“Average”的宽度。 - StevenWidthConverter
函数从未被调用过。你知道为什么吗?另外,我的代码示例在你那里是否执行正确? - Steven