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

Wpf 绑定文本属性时的奇怪组合框行为,wpf,data-binding,Wpf,Data Binding,如果我们有一个combobox绑定到视图模型上的TimeSpan属性“双向”,以及一个转换器将TimeSpan视图模型属性更改为字符串,并添加一个“m”数分钟,那么当编辑combobox值时,比如从10m到5,我希望: WPF绑定调用ConvertBack以获取更新源属性的值——假设这是一个5分钟的时间跨度 调用视图模型的timespan属性设置器并设置基础字段(从timespan 10更改为5),然后引发OnPropertyChanged WPF绑定接收事件并因此调用其处理程序方法,该方法首先

如果我们有一个combobox绑定到视图模型上的TimeSpan属性“双向”,以及一个转换器将TimeSpan视图模型属性更改为字符串,并添加一个“m”数分钟,那么当编辑combobox值时,比如从10m到5,我希望:

WPF绑定调用ConvertBack以获取更新源属性的值——假设这是一个5分钟的时间跨度

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

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

除此之外,最后一步不会发生,comboxbox保持在5。我确实想要这种行为,但我想理解为什么最后一步没有发生。奇怪的是,变为文本框确实会产生我期望的行为(立即更新5到5米)

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


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

转换器的ConvertBack方法将只设置绑定源属性的值,然后设置目标属性(即ypur文本框的文本)不会更新。如果是这样,则每次绑定的bindingmode为双向时都会有无限循环。当源属性发生更改时调用Convert方法,当绑定的目标属性发生更改时调用ConvertBack。希望这会有所帮助。

您能展示您的示例代码,说明您在哪里面临此问题,因为此示例代码适用于我-

XAML:

<TextBox Text="{Binding Time, Converter={StaticResource MyConverter}}"/>
转换器

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();
        }
    }

谢谢-我认为在更新目标或源之前,通过检查属性值是否已更改,可以避免“无限循环”。这是一个双向绑定,我的问题实际上是关于转换方法没有更新目标。非常感谢-我实际上已经更改为combobox并得到了描述的行为(对不起,应该说明这一点,出于某种原因,我的大脑中有textbox);更改回文本框会产生与您的代码相同的行为(我的代码与您的代码几乎相同)。知道为什么组合框会有不同的行为吗?
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();
        }
    }