Wpf 绑定文本属性时的奇怪组合框行为
如果我们有一个combobox绑定到视图模型上的TimeSpan属性“双向”,以及一个转换器将TimeSpan视图模型属性更改为字符串,并添加一个“m”数分钟,那么当编辑combobox值时,比如从10m到5,我希望: WPF绑定调用ConvertBack以获取更新源属性的值——假设这是一个5分钟的时间跨度 调用视图模型的timespan属性设置器并设置基础字段(从timespan 10更改为5),然后引发OnPropertyChanged WPF绑定接收事件并因此调用其处理程序方法,该方法首先对值进行转换,然后将此“5m”转换值设置为目标文本属性 除此之外,最后一步不会发生,comboxbox保持在5。我确实想要这种行为,但我想理解为什么最后一步没有发生。奇怪的是,变为文本框确实会产生我期望的行为(立即更新5到5米) 编辑:原始问题错误地说明了文本框,我应该在其中编写组合框Wpf 绑定文本属性时的奇怪组合框行为,wpf,data-binding,Wpf,Data Binding,如果我们有一个combobox绑定到视图模型上的TimeSpan属性“双向”,以及一个转换器将TimeSpan视图模型属性更改为字符串,并添加一个“m”数分钟,那么当编辑combobox值时,比如从10m到5,我希望: WPF绑定调用ConvertBack以获取更新源属性的值——假设这是一个5分钟的时间跨度 调用视图模型的timespan属性设置器并设置基础字段(从timespan 10更改为5),然后引发OnPropertyChanged WPF绑定接收事件并因此调用其处理程序方法,该方法首先
更新:使用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();
}
}