我有这样的ComboBox:
<ComboBox Grid.Column="1" Padding="0" Margin="5,0,0,0" VerticalAlignment="Center" HorizontalContentAlignment="Center" IsEnabled="{Binding CanUserEdit}" SelectedValue="{Binding ConfigValue, Converter={StaticResource BoolToStringConverter}, Mode=TwoWay}">
<ComboBoxItem x:Uid="NoButton" />
<ComboBoxItem x:Uid="YesButton" />
</ComboBox>
应该是正常的“是/否” ComboBox,但我想避免绑定到某些“是/否ItemsSource”,以避免不必要的麻烦。
BoolToStringConverter看起来像这样:
public class BoolToStringConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
var val = value as bool?;
if (val == true)
return ResourceLoader.GetForCurrentView().GetString("YesButton/Content");
else
return ResourceLoader.GetForCurrentView().GetString("NoButton/Content");
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
var val = value as string;
if (val == ResourceLoader.GetForCurrentView().GetString("YesButton/Content"))
return new bool?(true);
else
return new bool?(false);
}
}
所以通常来说,我从ComboBoxItem内的资源中获得了字符串,而ViewModel内的值是一个对象(不是布尔值,它不像我在使用TemplateSelector时那样简单,ComboBox应该仅用于布尔值,其他则是带有字符串的普通TextBox。)
我从ViewModel中获取值,将其从资源转换为完全相同的字符串,但是在加载控件时,它没有映射SelectedValue(ComboBox为空,即使它应包含Yes / No值也是如此)。但是“ ConvertBack”正常工作。当我在此ComboBox中选择某项内容(例如“ No”值)时,它将正确进入ConvertBack方法内,比较字符串并设置正确的布尔值? ViewModel中的值。因此,ConvertBack可以很好地工作,但是初始Convert不能正确设置SelectedValue,因为此时似乎无法将“ Yes”识别为“ Yes”,将“ No”识别为“ No”(可能是因为它试图比较字符串和ComboBoxItem)。我该如何解决?
当我使用x:String而不是ComboBoxItem时,它可以工作...但是x:String无法本地化,并且我不想使其硬编码为某些语言。
答案 0 :(得分:1)
问题在于类型不匹配。
在您的XAML中,ComboBox
的子项类型为 ComboBoxItem ,并且您的BoolToStringConverter.Convert
方法返回字符串。这两种类型无法建立正确的等效关系。
您可以尝试在SelectedValuePath
中设置ComboBox
属性:
<ComboBox Grid.Column="1"
...
SelectedValuePath="Content">
<ComboBoxItem x:Uid="NoButton" />
<ComboBoxItem x:Uid="YesButton" />
</ComboBox>
但是我建议使用ItemsSource
进行数据源绑定,并使用DataTemplate
设置子项的布局。
以下是有关绑定的示例,您可以在ComboBox
最诚挚的问候。