如果我们有一个将“twoway”绑定(bind)到 View 模型上的 TimeSpan 属性的组合框,并且转换器将时间跨度 View 模型属性更改为字符串,添加表示分钟的“m”,那么在编辑组合框值时说10m 到 5,我预计:
WPF 绑定(bind)调用 ConvertBack 来获取更新源属性的值 - 我们假设时间跨度为 5 分钟。
调用 View 模型的时间跨度属性 setter 并设置基础字段(时间跨度从 10 更改为 5),然后引发 OnPropertyChanged
WPF Binding 接收事件,因此调用其处理程序方法,该方法首先对值执行转换,然后将此“5m”转换后的值设置为目标文本属性
除了,最后一步没有发生,并且组合框保持在 5。我实际上想要这种行为,但想了解为什么最后一步没有发生。奇怪的是,更改为文本框确实给出了我期望的行为(立即更新 5 到 5m)
编辑:原始问题错误地指出了文本框,我应该在其中编写组合框
更新:使用 snoop 实用程序,我看到组合框的文本属性确实变为 5m,但显示仍为 5 - 我只能假设如果正在编辑组合框,它不会刷新其文本显示。将问题标题从“使用转换器的 WPF 数据绑定(bind)目标-源-目标循环”更改为更准确地反射(reflect)现在的问题。
最佳答案
您能否展示您遇到此问题的示例代码,因为此示例代码适用于我 -
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();
}
}
关于wpf - 绑定(bind)文本属性时出现奇怪的组合框行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9439981/