MultiBindingConverter无法在WPF MVVM应用程序的网格上工作



我在WPF Telerik网格中有一列需要基于两件事进行限制。

ViewModel上的IsEditable属性和IsManualChange属性,后者是网格绑定到的List的属性。。。

我写了一个MultiBoolConverter来处理这个问题,并在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>

然而,进入转换器的值是bool(来自ViewModel)和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"比较

一个线索可能是转换器只被调用一次,而不是像我预期的那样每行调用一次。

有人知道我该怎么做吗?

在传递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而不是null,因为null可能是有效的属性值,以及有效的(和常用)默认值。

所以基本上DataContext当前为null,所以它找不到名为IsManualChange的属性,所以您得到UnsetValue。

一旦设置了上下文,就应该再次调用转换器。

原来Telerik网格将IsReadOnly绑定到ViewModel,并且当您想绑定到ItemsSource中的项时,必须使用IsReadOnlyBinding!

相关内容

  • 没有找到相关文章

最新更新