绑定到ObservableCollection <string>

时间:2015-05-28 12:21:23

标签: c# wpf

我正在尝试做一些非常简单的事情:我想在ItemsControl中显示一个ObservableCollection。我还希望用户能够编辑ObservableCollection中的字符串。

我的viewmodel非常简单:

public class MainViewModel : ViewModelBase
{
    public ObservableCollection<string> Values { get; set; }

    public MainViewModel()
    {
        Values = new ObservableCollection<string> { "foo", "bar" };
    }
}

在我看来,我为ItemsControl定义了一个DataTemplate,以便在每个项目中显示一个文本框,这里没问题:

<ItemsControl ItemsSource="{Binding Values}">
            <ItemsControl.ItemTemplate>
                <DataTemplate DataType="{x:Type sys:String}">
                    <TextBox Text="{Binding Path=., UpdateSourceTrigger=PropertyChanged}" />
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>

一切似乎都顺利进行,我可以在视图中看到我的ObservableCollection的内容。但是,当我在文本框中编辑文本时,我的ObservableCollection没有更新,值仍然是相同的。

我发现这项工作的唯一解决方法是创建一个类:

public class StringWrapper
{
    public string Value { get; set; }
}

然后我将我的ObservableCollection的类型更改为ObservableCollection<StringWrapper>,并在我的DataTemplate中,将TextBox的Text属性绑定到Value。它有效,但很难看。

所以我的问题是,有没有办法将ObservableCollection绑定到ItemsControl并能够更新值?

3 个答案:

答案 0 :(得分:2)

除非它由列表控件直接处理,否则我怀疑是否有任何方法可以做到这一点。 ItemsControl中的模板化项目只能访问string实例,而不能访问实际的集合。由于string是不可变的,它是一个死胡同,因此无法追溯对父级的更改。

答案 1 :(得分:0)

我认为绑定到自己会做的工作+别忘了把它放在两边。

TextBox Text =“{Binding}”,Mode = TwoWay

答案 2 :(得分:0)

你的属性值只需要实现INotifyPropertyChanged接口,只需绑定Values属性就可以了。

相关问题