我有一个带有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);
}
}
答案 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;
}