Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将分隔的文本框字符串绑定和转换回ObservableCollection<;字符串>;?_C#_Wpf_Mvvm_Data Binding_Binding - Fatal编程技术网

C# 如何将分隔的文本框字符串绑定和转换回ObservableCollection<;字符串>;?

C# 如何将分隔的文本框字符串绑定和转换回ObservableCollection<;字符串>;?,c#,wpf,mvvm,data-binding,binding,C#,Wpf,Mvvm,Data Binding,Binding,我有一个带有ObservableCollection的视图模型,它绑定到一个文本框。用户必须能够使用一些分隔符(比如逗号或分号)输入文本数据,并将更改反映到observedcollection,因此如果我在框中键入abc,123,one,那么observedcollection将有三项:abc,123和one 我的示例视图模型: class ViewModel { public ObservableCollection<string> MyObservableCollecti

我有一个带有
ObservableCollection
的视图模型,它绑定到一个
文本框
。用户必须能够使用一些分隔符(比如逗号或分号)输入文本数据,并将更改反映到
observedcollection
,因此如果我在框中键入
abc,123,one
,那么
observedcollection
将有三项:
abc
123
one

我的示例视图模型:

class ViewModel {
    public ObservableCollection<string> MyObservableCollection { get; set; }
}
类视图模型{
公共ObservableCollection 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(',');
    }
}
公共类ObservableCollectionToAndFromString:IValueConverter
{
公共对象转换(对象值、类型targetType、对象参数、CultureInfo区域性)
{
可观察收集oc;
if(targetType!=typeof(string)| |(oc=作为ObservableCollection的值)==null)
不做任何事;
返回字符串。Join(“,”,oc);
}
公共对象转换回(对象值、类型targetType、对象参数、CultureInfo区域性)
{
var str=字符串形式的值;
返回str==null
?装订。什么都不做
:str.Split(',');
}
}
但出于可以理解的原因,它不起作用-WPF不知道如何用
string[]
替换
observedcollection

但是我不希望框架用新的
observateCollection
对象替换我的
observateCollection
对象(在这种情况下,我可以创建一个新对象,并在
ConvertBack
方法中返回它)。我想让它在现有的
可观察集合
中添加/删除项目

如何实现这一点(没有另一个模型视图
string
属性来完成代码隐藏的工作)

编辑:
好吧,我放弃。。。movel view是一条路要走。。。我希望它能一次在多个字段上工作,但这太尴尬了。

我认为最好在viewmodel中添加数据的字符串表示形式

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}"/>
内部类视图模型
{
公共ObservableCollection MyObservableCollection{get;set;}
公共字符串MyString
{
获取{return string.Join(“,”,MyObservableCollection);}
设置{//根据值在此处更新可观察集合}
}
}

我认为最好在viewmodel中添加数据的字符串表示形式

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}"/>
内部类视图模型
{
公共ObservableCollection MyObservableCollection{get;set;}
公共字符串MyString
{
获取{return string.Join(“,”,MyObservableCollection);}
设置{//根据值在此处更新可观察集合}
}
}

我认为最好在viewmodel中添加数据的字符串表示形式

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}"/>
内部类视图模型
{
公共ObservableCollection MyObservableCollection{get;set;}
公共字符串MyString
{
获取{return string.Join(“,”,MyObservableCollection);}
设置{//根据值在此处更新可观察集合}
}
}

我认为最好在viewmodel中添加数据的字符串表示形式

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}"/>
内部类视图模型
{
公共ObservableCollection MyObservableCollection{get;set;}
公共字符串MyString
{
获取{return string.Join(“,”,MyObservableCollection);}
设置{//根据值在此处更新可观察集合}
}
}

这是我目前的解决方案,但我不满意。额外的领域和缺乏概括困扰着我。。。(是的,这就是视图模型的用途,@Dennis,但我很乐意将此解决方案应用到其他地方以及许多字段上,只需一笔……@Tal您的视图模型应提供易于视图使用的数据。如果你正在构建一个复杂的东西(而且你必须跳转才能实现它),那么你就做错了。仅仅用一个转换器是做不到的。正如@Dennis提到的,这就是为什么我们有一个视图模型层。因此,我们可以使数据适应表示层。所以你不应该为这样使用它而烦恼。@Tal:在网上搜索“ViewModel基本上是一个类固醇上的值转换器”,你会发现相当有趣的阅读。这是我目前的解决方案,但我不满意。额外的领域和缺乏概括困扰着我。。。(是的,这就是视图模型的用途,@Dennis,但我很乐意将此解决方案应用到其他地方以及许多字段上,只需一笔……@Tal您的视图模型应提供易于视图使用的数据。如果你正在构建一个复杂的东西(而且你必须跳转才能实现它),那么你就做错了。仅仅用一个转换器是做不到的。正如@Dennis提到的,这就是为什么我们有一个视图模型层。因此,我们可以使数据适应表示层。所以你不应该为这样使用它而烦恼。@Tal:在网上搜索“ViewModel基本上是一个类固醇上的值转换器”,你会发现相当有趣的阅读。这是我目前的解决方案,但我不满意。额外的领域和缺乏概括困扰着我。。。(是的,这就是视图模型的用途,@Dennis,但我很乐意将此解决方案应用到其他地方以及许多字段上,只需一笔……@Tal您的视图模型应提供易于视图使用的数据。如果你正在构建一个复杂的东西(而且你必须跳转才能实现它),那么你就做错了。仅仅用一个转换器是做不到的。正如@Dennis提到的,这就是为什么我们有一个视图模型层。因此,我们可以使数据适应表示层。所以你不应该为这样使用它而烦恼。@Tal:在网上搜索“ViewModel基本上是一个类固醇上的值转换器”,你会发现相当有趣的阅读。这是我目前的解决方案,但我不满意。额外的五