0

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

ViewModel 上的 IsEditable 属性和 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>

然而,进入转换器的值是一个布尔值(来自 ViewModel)和一个来自 IsManualChange 的 DependencyProperty.UnsetValue!

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”比较

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

有谁知道我怎样才能让这个工作?

4

2 回答 2

1

在传递 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 可以是有效的属性值,也可以是有效的(并且经常使用的)DefaultValue。

所以基本上DataContext当前是空的,所以它找不到一个名为IsManualChange所以你得到UnsetValue的属性。

设置上下文后,您的转换器应该再次被调用。

于 2011-06-16T14:39:02.657 回答
0

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

于 2011-06-20T14:27:11.433 回答