【发布时间】:2014-12-02 23:04:25
【问题描述】:
我有ObservableCollection<string> 的视图模型,它绑定到TextBox。用户必须能够输入带有一些分隔符(比如逗号或分号)的文本数据,并将更改反映到ObservableCollection<string>,所以如果我在框中输入abc,123,one,ObservableCollection<string> 将包含三个项目:abc、123 和 one。
我的示例视图模型:
class ViewModel {
public ObservableCollection<string> MyObservableCollection { get; set; }
}
我的文本框:
<TextBox Text="{Binding MyObservableCollection, Converter={StaticResource Conv}, Mode=TwoWay}"/>
我的价值转换器:
public class ObservableCollectionToAndFromString : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
ObservableCollection<string> oc;
if (targetType != typeof (string) || (oc = value as ObservableCollection<string>) == null)
return Binding.DoNothing;
return string.Join(",", oc);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
var str = value as string;
return str == null
? Binding.DoNothing
: str.Split(',');
}
}
但由于可以理解的原因它不起作用 - WPF 不知道如何将 ObservableCollection<string> 替换为 string[]。
但我不希望框架用新的ObservableCollection<string> 对象替换我的ObservableCollection<string> 对象(在这种情况下,我可以创建一个新对象并在ConvertBack 方法中返回它)。我希望它在现有的ObservableCollection<string> 中添加/删除项目。
我怎样才能做到这一点(没有另一个模型视图 string 属性可以在代码隐藏中完成工作)?
编辑:
好吧,我放弃了... movel-view 是要走的路...我希望让它同时在多个领域工作,但这太尴尬了。
【问题讨论】:
-
ConvertBack应该总是返回一个新对象。它就是这样设计的。我不明白为什么在这里返回一个新对象可能是个问题。对旧集合的引用会在适当的时候被 GC 自动收集,所以你不必担心内存泄漏...
标签: c# wpf mvvm data-binding binding