通过转换器绑定SelectedValue不匹配ItemsSource中的任何内容

时间:2015-04-25 19:36:09

标签: c# wpf data-binding combobox

我有一个类似于以下内容的ComboBox,其中SelectedValue绑定到int,而ItemsSource绑定到string s的集合:

<ComboBox
  SelectedValue="{Binding Value, Converter={StaticResource PriorityInt2StringConverter}}"
  ItemsSource="{Binding Path=StringToIntDictionary.Keys, Source={x:Static helpers:HelperClass.Instance}}"/>

PriorityInt2StringConverter转换器如下所示:

public class PriorityIntToStringConverter : IValueConverter
{
    private static readonly HelperClass helper = HelperClass.Instance;

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is int)
        {
            int priority = (int)value;
            string priorityStr;
            if (helper.IntToStringDictionary.TryGetValue(priority, out priorityStr))
            {
                value = priorityStr;
            }
        }

        return value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        string priority = value as string;
        if (priority != null)
        {
            int priorityInt;
            if (helper.StringToIntDictionary.TryGetValue(priority, out priorityInt))
            {
                value = priorityInt;
            }
        }

        return value;
    }
}

组合框选项按照我的预期填充,并且当调用转换器时,它会按预期返回,但只在首次渲染控件时调用 - 从未在我预期的选择更改时调用。

现在,问题是:当ComboBox选择发生变化时,更改不会停止 - Value上的设置器永远不会被调用,选择也会丢失。

1 个答案:

答案 0 :(得分:0)

您的绑定看起来没问题,因此当选择更改时,应调用转换器的ConvertBack方法。你检查过了吗?

value方法返回的ConvertBack实际上返回一个整数很重要。否则,绑定的Value属性无法正确设置。

如果您的if - 声明:

if (helper.StringToIntDictionary.TryGetValue(priority, out priorityInt))

返回falsevalue永远不会被设置为整数,因此永远不会调用Value属性的setter。您还将收到一个错误,可以在调试时在输出窗口中看到(可能是FormatException)。

所以我会开始准确地研究ConvertBack方法。确保从stringint的转换适用于所有情况。也许你还应该指定一个默认值,如果TryGetValue方法返回false,将返回默认值,以确保在每种情况下都返回一个有效值。