MultiBindingConvertor не работает с сеткой в ​​приложении WPF MVVM - PullRequest
0 голосов
/ 16 июня 2011

У меня есть столбец в сетке 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, являются bool (из 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»

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

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

Ответы [ 2 ]

1 голос
/ 16 июня 2011

Перед передачей 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. UnsetValue используется, а не ноль, потому что нуль может быть допустимым свойством значение, а также действительное (и часто используется) DefaultValue.

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

Как только контекст настроен, ваш конвертер должен быть вызван снова.

0 голосов
/ 20 июня 2011

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

...