Привязать ширину столбца DataGrid к двум столбцам другой DataGrid

Вопрос: Как мне связать StatName.Width в Samp1.ActualWidth + Samp2.ActualWidth?

Текущий против желаемого

Суб-вопросы:

Почему мой WidthConverter функции никогда не выполняются (точки останова никогда не достигают)?

Что правильно <Binding ... синтаксис для отдельных компонентов MultiBinding?

Что я пробовал:

Я думаю, что мне нужно назначить DataGridTextColumn.Width с MultiBinding и какой-то тип конвертера.

Я попытался собрать решение из различных примеров в Интернете. Я не могу собрать все это вместе.

РЕДАКТИРОВАТЬ

С использованием <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 (часть кода)

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.

  1. Дизайнер Visual Studio подчеркивает весь тег <MultiBinding ... </MultiBinding> на циан.
  2. Окно Список ошибок сообщает об ошибке "Указанное преобразование недопустимо".
  3. Хотя это отображается как ошибка, Visual Studio все равно будет создавать и выполнять код.
Другие вопросы по тегам