使用资源和转换器将UWP绑定到ComboBoxItem

时间:2019-12-23 09:44:28

标签: c# xaml uwp

我有这样的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无法本地化,并且我不想使其硬编码为某些语言。

1 个答案:

答案 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

上执行相同的操作

最诚挚的问候。