我有一个类似于以下内容的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
上的设置器永远不会被调用,选择也会丢失。
答案 0 :(得分:0)
您的绑定看起来没问题,因此当选择更改时,应调用转换器的ConvertBack
方法。你检查过了吗?
value
方法返回的ConvertBack
实际上返回一个整数很重要。否则,绑定的Value
属性无法正确设置。
如果您的if
- 声明:
if (helper.StringToIntDictionary.TryGetValue(priority, out priorityInt))
返回false
,value
永远不会被设置为整数,因此永远不会调用Value
属性的setter。您还将收到一个错误,可以在调试时在输出窗口中看到(可能是FormatException
)。
所以我会开始准确地研究ConvertBack
方法。确保从string
到int
的转换适用于所有情况。也许你还应该指定一个默认值,如果TryGetValue
方法返回false
,将返回默认值,以确保在每种情况下都返回一个有效值。