Привязать ширину столбца DataGrid к двум столбцам другой DataGrid
Вопрос: Как мне связать StatName.Width
в Samp1.ActualWidth + Samp2.ActualWidth
?
Суб-вопросы:
Почему мой WidthConverter
функции никогда не выполняются (точки останова никогда не достигают)?
Что правильно <Binding ...
синтаксис для отдельных компонентов MultiBinding?
Что я пробовал:
Я думаю, что мне нужно назначить DataGridTextColumn.Width
с MultiBinding
и какой-то тип конвертера.
Я попытался собрать решение из различных примеров в Интернете. Я не могу собрать все это вместе.
РЕДАКТИРОВАТЬ
С использованием <Binding ElementName="Samp1" Path="ActualWidth" />
- Нет ошибок или предупреждений при сборке.
Convert
функция не ударил- Нет соответствующих сообщений в выводе
С использованием <Binding Source="{x:Reference Samp1}" Path="ActualWidth" />
- Ошибка сборки (которая все еще позволяет выполнение): указанное приведение недействительно. За
<MultiBinding>...</MultiBinding>
, Convert
трижды вызывается при загрузке. Не вызывается при изменении размера столбца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')
Попытка 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 (часть кода)
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;
}
}
1 ответ
Наконец, код выполняется, как ожидается, со следующим:
<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 все равно будет создавать и выполнять код.