【问题标题】:Strange Combobox behaviour when binding text property绑定文本属性时奇怪的组合框行为
【发布时间】:2012-03-15 10:45:11
【问题描述】:

如果我们有一个组合框将“twoway”绑定到视图模型上的 TimeSpan 属性,并且转换器将时间跨度视图模型属性更改为字符串,添加一个“m”表示分钟,然后在编辑组合框值时说10m 到 5,我预计:

WPF Binding 调用 ConvertBack 以获取更新源属性的值 - 假设时间跨度为 5 分钟。

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

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

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

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

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

【问题讨论】:

    标签: wpf data-binding


    【解决方案1】:

    转换器的ConvertBack方法只会设置Binding源属性的值,那么你的目标属性(即ypur TextBox的Text)将不会被更新。如果是这样,那么每次绑定模式时都会无限循环绑定将是 TwoWay.Convert 当源属性发生变化时调用方法,当绑定的目标属性发生变化时调用 ConvertBack。希望这会有所帮助。

    【讨论】:

    • 谢谢 - 我认为在更新目标或源之前检查属性值是否已更改可以避免“无限循环”。这是双向绑定,我的问题实际上是关于 convert 方法不更新目标。
    【解决方案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();
            }
        }
    

    【讨论】:

    • 非常感谢 - 我实际上已更改为组合框并得到了描述的行为(抱歉应该说明这一点,由于某种原因我的大脑中有文本框);改回文本框会产生与您的代码相同的行为(我的代码与您的代码几乎相同)。知道为什么组合框的行为会有所不同吗?
    猜你喜欢
    • 1970-01-01
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-30
    • 2010-11-11
    • 1970-01-01
    • 2010-12-23
    相关资源
    最近更新 更多