MultiBindingConvertor не работает с сеткой в ​​​​приложении WPF MVVM

У меня есть столбец в сетке WPF Telerik, который мне нужно ограничить на основе двух вещей.

Свойство IsEditable в ViewModel и свойство IsManualChange, которое является свойством списка, к которому привязана сетка...

Я написал MultiBoolConvertor для обработки этого и реализовал в WPF следующим образом:

<telerik:GridViewComboBoxColumn 
    Header="Selection" 
    DataMemberBinding="{Binding HandHeldDifference.GRSSelection}" 
    ItemsSource="{Binding Path=SelectionOptions}">
    <telerik:GridViewComboBoxColumn.IsReadOnly>
        <MultiBinding Converter="{StaticResource MultiBoolConv}" 
            ConverterParameter="True">
            <Binding 
                RelativeSource="{RelativeSource FindAncestor, 
                    AncestorType={x:Type StackPanel}}" 
                Path="DataContext.IsEditable" />
            <Binding Path="IsManualChange" />
        </MultiBinding>
    </telerik:GridViewComboBoxColumn.IsReadOnly>
</telerik:GridViewComboBoxColumn>

Однако значения, которые поступают в Convertor, являются логическими (из ViewModel) и DependencyProperty.UnsetValue из IsManualChange!

public object Convert(object[] values, 
                        Type targetType, 
                        object parameter, 
                        CultureInfo culture)
{
    var defaultReturn = false;
    if (parameter != null)
    {
        bool.TryParse(parameter.ToString(), out defaultReturn);
    }

    if (values == null) return defaultReturn;
    if (values.Length < 2) return defaultReturn;
    if (values[0] is bool && values[1] is bool)
    {
        return ((bool) values[0]) && ((bool) values[1]);
    }
    return defaultReturn;
}

Второе значение явно не соответствует сравнению "values[1] is bool"

Подсказка может заключаться в том, что преобразователь вызывается только один раз, а не для каждой строки, как я ожидал.

Кто-нибудь знает, как я могу заставить это работать, пожалуйста?


person Andy Clarke    schedule 16.06.2011    source источник
comment
Вы пытались добавить PresentationTraceSources.TraceLevel=High во вторую привязку и проверить окно вывода?   -  person WaltiD    schedule 16.06.2011


Ответы (2)


Перед передачей DataContext вы получите DependencyProperty.UnsetValue и нужно обработать этот случай. Итак, вы можете сделать что-то вроде:

bool isManualChange= (value[1] is bool) ? (bool)value[1] : false; // or true depending on which should be the default

Из ссылки выше:

UnsetValue — это сигнальное значение, которое используется в сценариях, когда система свойств WPF не может определить запрошенное значение DependencyProperty. Вместо null используется UnsetValue, поскольку null может быть допустимым значением свойства, а также допустимым (и часто используемым) DefaultValue.

Таким образом, в настоящее время DataContext имеет значение null, поэтому он не может найти свойство с именем IsManualChange, поэтому вы получаете UnsetValue.

После настройки контекста ваш преобразователь должен снова вызваться.

person CodeNaked    schedule 16.06.2011

Оказывается, сетка Telerik привязывает IsReadOnly к ViewModel, и вам нужно использовать IsReadOnlyBinding, когда вы хотите привязаться к элементу в ItemsSource!

person Andy Clarke    schedule 20.06.2011