0

2 つのことに基づいて制限する必要がある 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>

ただし、Convertor に渡される値は、(ViewModel からの) bool と、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;
}

2 番目の値は明らかに「values[1] is bool」の比較に失敗します

手がかりは、私が期待するように、コンバーターが1行ごとではなく、1回だけ呼び出されていることです。

どうすればこれを機能させることができるか知っている人はいますか?

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 値を特定できないシナリオで使用されるセンチネル値です。null は、有効な (そして頻繁に使用される) DefaultValue と同様に、有効なプロパティ値である可能性があるため、null ではなく UnsetValue が使用されます。

したがって、基本的に DataContext は現在 null であるため、名前付きのプロパティが見つからないため、IsManualChangeUnsetValue を取得します。

コンテキストがセットアップされると、コンバーターが再度呼び出されるはずです。

于 2011-06-16T14:39:02.657 に答える
0

Telerik グリッドが IsReadOnly を ViewModel にバインドし、ItemsSource のアイテムにバインドする場合は IsReadOnlyBinding を使用する必要があることがわかりました。

于 2011-06-20T14:27:11.433 に答える