绑定文本属性时出现奇怪的组合框行为

时间:2012-02-25 00:28:20

标签: wpf data-binding

如果我们有一个组合框绑定'twoway'到视图模型上的TimeSpan属性,并且转换器将时间跨度视图模型属性更改为字符串,添加'm'几分钟,那么当编辑组合框值时,请说10米到5点,我希望:

WPF Binding调用ConvertBack获取更新源属性的值 - 让我们假设这是5分钟的时间跨度。

调用视图模型的timespan属性setter并设置基础字段(从10到5的时间跨度),然后引发OnPropertyChanged

WPF绑定接收事件,因此调用其处理程序方法,该方法首先对值进行转换,然后将此“5m”转换后的值设置为目标文本属性

除此之外,最后一步没有发生,并且comboxbox保持在5.我实际上想要这种行为,但是想了解为什么最后一步没有发生。奇怪的是改变到文本框确实给出了我期望的行为(立即更新5到5米)

编辑:原始问题错误地说明了我应该编写组合框的文本框

更新:使用snoop实用程序,我看到组合框的文本属性确实变为5米,但显示仍为5 - 我只能假设组合框正在被编辑,它不会刷新其文本显示。更改了“使用转换器的WPF数据绑定目标 - 源 - 目标周期”中的问题标题,以更准确地反映现在的情况。

2 个答案:

答案 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。希望这会有所帮助。