我正在尝试做一些非常简单的事情:我想在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并能够更新值?
答案 0 :(得分:2)
除非它由列表控件直接处理,否则我怀疑是否有任何方法可以做到这一点。 ItemsControl
中的模板化项目只能访问string
实例,而不能访问实际的集合。由于string
是不可变的,它是一个死胡同,因此无法追溯对父级的更改。
答案 1 :(得分:0)
我认为绑定到自己会做的工作+别忘了把它放在两边。
TextBox Text =“{Binding}”,Mode = TwoWay
答案 2 :(得分:0)
你的属性值只需要实现INotifyPropertyChanged接口,只需绑定Values属性就可以了。