如果我们有一个组合框绑定'twoway'到视图模型上的TimeSpan属性,并且转换器将时间跨度视图模型属性更改为字符串,添加'm'几分钟,那么当编辑组合框值时,请说10米到5点,我希望:
WPF Binding调用ConvertBack获取更新源属性的值 - 让我们假设这是5分钟的时间跨度。
调用视图模型的timespan属性setter并设置基础字段(从10到5的时间跨度),然后引发OnPropertyChanged
WPF绑定接收事件,因此调用其处理程序方法,该方法首先对值进行转换,然后将此“5m”转换后的值设置为目标文本属性
除此之外,最后一步没有发生,并且comboxbox保持在5.我实际上想要这种行为,但是想了解为什么最后一步没有发生。奇怪的是改变到文本框确实给出了我期望的行为(立即更新5到5米)
编辑:原始问题错误地说明了我应该编写组合框的文本框
更新:使用snoop实用程序,我看到组合框的文本属性确实变为5米,但显示仍为5 - 我只能假设组合框正在被编辑,它不会刷新其文本显示。更改了“使用转换器的WPF数据绑定目标 - 源 - 目标周期”中的问题标题,以更准确地反映现在的情况。
答案 0 :(得分:2)
您可以在面对此问题的地方展示示例代码,因为此示例代码适用于我 -
<强> XAML:强>
<TextBox Text="{Binding Time, Converter={StaticResource MyConverter}}"/>
<强>属性强>
public TimeSpan Time
{
get
{
return time;
}
set
{
if (time != value)
{
time = value;
OnPropertyChanged("Time");
}
}
}
<强>转换器强>
public class MyConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is TimeSpan)
{
return ((TimeSpan)value).Minutes.ToString() + "m";
}
return String.Empty;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is string)
{
return new TimeSpan(0, System.Convert.ToInt32(value), 0);
}
return new TimeSpan();
}
}
答案 1 :(得分:0)
转换器的ConvertBack方法只会设置Binding source属性的值,那么你的目标属性(即ypur TextBox的Text)就不会被更新了。如果它会这样那么每次绑定模式时都会有无限循环绑定将是TwoWay.Convert方法在source属性发生更改时调用,并且当绑定的target属性发生更改时调用ConvertBack。希望这会有所帮助。