0

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

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

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

我还应该提到这个页面正在使用 Caliburn.Micro MVVM。不确定它是否有区别,但以防万一......

这是组合框 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);
}

}

4

1 回答 1

0

使用 Telerik RadComboBox,SelectedItem将为空(未选择任何内容时)。我的猜测是您的转换器正在被调用(在您的 RadComboBox 中没有选择)并且 null 被正确地传递给您的转换器。我意识到你的转换器只是一个骨架,但你总是需要在你的转换器中处理 null 和数据类型......下面的例子。

此外,传递给您的转换器的值将与您的 RadComboBox 中的 SelectedItem 具有相同的数据类型(无论 RecordTypes 是一个列表 - 可能不是布尔列表?)。

下面的示例基本 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 回答