Хотя это отображается как ошибка, Visual Studio все равно будет создавать и выполнять код.

с: Как мне связать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;
    }
}
 Steven12 дек. 2017 г., 02:45
@ Боб, я пыталсяforeach ( double Width in values ) totalWidth += Width;, Код скомпилирован и запущен, ноStatName колонка была все еще шириной в словоСредний
 P.Manthe12 дек. 2017 г., 02:18
Ты уверенActualWidth не являетсяdouble? Я пытался изменить формуDataGridLength вdouble и это сработало.
 P.Manthe13 дек. 2017 г., 01:58
Хорошо, я неправильно понял вашу проблему и теперь могу ее воспроизвести.Я нашел некоторую информацию здесь, Я постараюсь найти способ ее решить и сообщить вам.
 Steven12 дек. 2017 г., 19:58
@ Боб Я обнаружил, что ниWidthConverter функция никогда не вызывается. Ты знаешь почему? Кроме того, мой пример кода выполнялся правильно для вас?
 H.B.13 дек. 2017 г., 12:53
@ Steven: Конвертер, вероятно, не сработал, потому что привязка сначала выдает ошибку. Всегда проверяйтеOutput окно для ошибок привязки.

Ответы на вопрос(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 все равно будет создавать и выполнять код.

Ваш ответ на вопрос