0

Telerik RadComboBoxを含むSilverlightページがあり、ComboBoxで選択されているアイテムに基づいて表示/非表示にする必要がある別の要素があります。私がやりたいのは、適切なアイテムが選択されていることを示すように、非表示の要素のVisibilityプロパティをバインドすることです。

これを行うために、非常に単純なValueConverterを作成し、RadComboBoxのSelectedItemをそのコンバーターにバインドして、選択されているアイテムを評価し、適切なVisibilityを返すようにしています。本当に簡単なものですが、なぜか今日はうまくいきません。多分カフェインが足りない...

問題は、ValueConverterが呼び出されたときに、渡される「値」がNULLになることです。

このページではCaliburn.MicroMVVMを使用していることにも言及する必要があります。それが違いを生むかどうかはわかりませんが、念のために考えました...

これがComboBoxXAMLです。

<telerik:RadComboBox x:Name="RecordTypes" SelectedItem="{Binding Path=SelectedRecordType, Mode=TwoWay}" ItemsSource="{Binding Path=RecordTypes, Mode=TwoWay}" EmptyText="Select..." />

他の要素のバインディングは次のとおりです。

Visibility="{Binding Path=SelectedItem, ElementName=RecordTypes, Mode=TwoWay, Converter={StaticResource VisibilityConverter}}" 

これが(汎用)コンバーターです。渡される値はまだNULLであるため、SelectedIndex値を読み取るようにまだ設定されていません。

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    bool visibility = (bool)value; <-- THIS VALUE IS NULL AND SHOULD NOT BE, IT SHOULD BE THE SelectedItem value
    return visibility ? Visibility.Visible : Visibility.Collapsed;
}

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
    Visibility visibility = (Visibility)value;
    return (visibility == Visibility.Visible);
}

}

4

1 に答える 1

0

Telerik RadComboBoxを使用すると、SelectedItemはnullになります(何も選択されていない場合)。私の推測では、コンバーターが呼び出されており(RadComboBoxで選択が行われていない)、nullがコンバーターに正しく渡されています。コンバーターはその時点では単なるスケルトンであると思いますが、コンバーターでは常にnull型とデータ型を処理する必要があります...以下の例。

また、コンバーターに渡される値は、RadComboBoxのSelectedItemと同じデータ型になります(RecordTypesがリストである場合は、boolのリストではない可能性があります)。

以下のベースboolToVisコンバーターの例。

public object Convert(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {

        if (value == null || !(value is bool))
            return Visibility.Collapsed;

        bool booInvert = false;
        if (parameter is string) bool.TryParse((string)parameter, out booInvert);

        if (booInvert) return ((bool)value) ? Visibility.Collapsed :Visibility.Visible;
        else return ((bool)value) ? Visibility.Visible : Visibility.Collapsed;
    }
于 2012-10-12T14:08:04.337 に答える