【问题标题】:How to bind and ConvertBack separated TextBox strings to an ObservableCollection<string>?如何绑定和 ConvertBack 分隔的 TextBox 字符串到 ObservableCollection<string>?
【发布时间】:2014-12-02 23:04:25
【问题描述】:

我有ObservableCollection&lt;string&gt; 的视图模型,它绑定到TextBox。用户必须能够输入带有一些分隔符(比如逗号或分号)的文本数据,并将更改反映到ObservableCollection&lt;string&gt;,所以如果我在框中输入abc,123,oneObservableCollection&lt;string&gt; 将包含三个项目:abc123one

我的示例视图模型:

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&lt;string&gt; 替换为 string[]

但我不希望框架用新的ObservableCollection&lt;string&gt; 对象替换我的ObservableCollection&lt;string&gt; 对象(在这种情况下,我可以创建一个新对象并在ConvertBack 方法中返回它)。我希望它在现有的ObservableCollection&lt;string&gt; 中添加/删除项目。

我怎样才能做到这一点(没有另一个模型视图 string 属性可以在代码隐藏中完成工作)?

编辑:

好吧,我放弃了... movel-view 是要走的路...我希望让它同时在多个领域工作,但这太尴尬了。

【问题讨论】:

  • ConvertBack 应该总是返回一个新对象。它就是这样设计的。我不明白为什么在这里返回一个新对象可能是个问题。对旧集合的引用会在适当的时候被 GC 自动收集,所以你不必担心内存泄漏...

标签: c# wpf mvvm data-binding binding


【解决方案1】:

我认为最好将数据的字符串表示形式添加到您的视图模型中。

internal class ViewModel
{
    public ObservableCollection<string> MyObservableCollection { get; set; }

    public string MyString
    {
        get { return string.Join(",", MyObservableCollection); }
        set { // update observable collection here based on value }
    }
}

<TextBox Text="{Binding MyString, Mode=TwoWay}"/>

【讨论】:

  • 这是我目前的解决方案,但我对此并不满意。额外的领域和缺乏泛化让我感到困扰......(是的,这就是视图模型的用途,@Dennis,但我很乐意将这个解决方案也应用到其他地方以及许多领域。 ..)
  • @Tal 您的视图模型应该提供易于被您的视图使用的数据。如果您正在构建一些复杂的东西(并且您必须跳过箍来实现它),那么您做错了。仅使用转换器是无法做到的。
  • 正如@Dennis 提到的,这就是我们有一个视图模型层的原因。所以我们可以将数据适配到表示层。所以你不应该为那样使用它而烦恼。
  • @Tal:在网络上搜索这个——“A ViewModel 基本上是类固醇上的值转换器”,你会发现读起来很有趣。
猜你喜欢
  • 2011-05-20
  • 2013-01-01
  • 2011-08-29
  • 1970-01-01
  • 2012-03-05
  • 2018-09-11
  • 2018-01-28
  • 2014-08-02
  • 2015-06-14
相关资源
最近更新 更多