Silverlight - 绑定元素将null传递给转换器

时间:2012-10-12 13:47:04

标签: silverlight telerik valueconverter

我有一个带有Telerik RadComboBox的Silverlight页面,我需要根据ComboBox中选择的项目显示/隐藏另一个元素。我想要做的是绑定隐藏元素的Visibility属性,以便它显示选中的相应项。

为了做到这一点,我创建了一个非常简单的ValueConverter,我试图将RadComboBox的SelectedItem绑定到该转换器,以便我可以评估选择的项目,并返回适当的可见性。真的很容易,但由于某种原因它今天不适合我。也许没有足够的咖啡因......

问题是,当调用ValueConverter时,传入的“值”为NULL。

我还应该提一下,这个页面使用的是Caliburn.Micro MVVM。不确定它是否有所作为,但想到以防万一......

这是ComboBox XAML:

<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}}" 

这是(通用)转换器。尚未设置读取SelectedIndex值,因为传入的值仍为NULL:

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);
}

}

1 个答案:

答案 0 :(得分:0)

使用Telerik RadComboBox,SelectedItem将为空(未选择任何内容时)。我的猜测是你的转换器被调用(没有在你的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;
    }