我希望做的事情非常简单:我想在一个ItemsControl中显示一个ObservableCollection。我还希望用户能够编辑ObservableCollection中的字符串。
我的视图模型非常简单:
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并能够更新值?
<TextBox Text="{Binding Path=., UpdateSourceTrigger=PropertyChanged}" />
这段代码中,String类未实现INotifyPropertyChanged
接口。请将其替换为<TextBox Text="{Binding}" />
。 - Aron