如何绑定到ObservableCollection的一个元素
本文关键字:一个 元素 何绑定 绑定 ObservableCollection | 更新日期: 2023-09-27 18:29:20
我有一个ObservableCollection,想要将Textbox绑定到该集合的特定元素。ObservableCollection中的项属于实现INotifyPropertyChanged的类型。
我曾想过创建一个从ObservableCollection中选择正确元素的Property,但当Collection中的相应元素发生变化时,我必须让这个Property实现,我不确定这是否是正确的方法。
通常,特别是如果您使用MVVM,您会有一个带有ObservableCollection的viewModel和一个使用数据绑定更新的SelectedItem属性。
例如,您的viewModel可能如下所示:
class ProductsViewModel : INotifyPropertyChanged
{
public ObservableCollection<Product> Products { get; set; }
private Product _selectedProduct;
public Product SelectedProduct
{
get { return _selectedProduct; }
set
{
_selectedProduct = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("SelectedProduct"));
}
}
public ProductsViewModel()
{
Products = new ObservableCollection<Product>();
Products.Add(new Product() { Name = "ProductA" });
Products.Add(new Product() { Name = "ProductB" });
}
public event PropertyChangedEventHandler PropertyChanged;
}
您的窗口对象xaml:
<Window x:Class="ProductsExample.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<ListBox HorizontalAlignment="Left" Height="171" Margin="32,29,0,0" VerticalAlignment="Top" Width="176"
ItemsSource="{Binding Products}"
SelectedItem="{Binding SelectedProduct, Mode=TwoWay}"
DisplayMemberPath="Name"
/>
<TextBox HorizontalAlignment="Left" Height="33" Margin="36,226,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="172"
Text="{Binding SelectedProduct.Name, Mode=TwoWay}"/>
</Grid>
</Window>
以及您刚刚设置数据上下文的代码:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.DataContext = new ProductsViewModel();
}
}
每当您在列表框中选择产品时,文本框都会用所选产品更新,如果您在文本框中更改产品(如果产品正确实现INotifyPropertyChanged),列表框中的项目也会更新。
显然,您只需使用后面的代码就可以实现所有这些,但原因如下:http://msdn.microsoft.com/en-us/magazine/dd419663.aspx,最好有一个ViewModel
如果您需要的项目是特定的索引,您可以使用索引访问
<TextBlock Text="{Binding MyItemsSource[2]}" />
为了解决我的问题,我创建了一个从ObservableCollection中选择正确元素的Property,并创建一个事件处理程序,该事件处理程序添加到ObservableCollectionCollectionChanged事件中,并为我的SelectionProperty引发PropertyChanged事件。
在包含ObservableCollection和SelectionProperty的类的构造函数中,代码看起来像这样:
myObservableColleciton.CollectionChanged +=
new NotifyCollectionChangedEventHandler(
myObservableCollection_CollectionChanged);
类中的其他地方定义了这个事件处理程序:
void myObservableCollection_CollectionChanged(
Object sender, NotifyCollectionChangedEventArgs e){
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("SelectionProperty"));
}
}
我选择的属性看起来像这样:
public User SelectionProperty
{
get { return myObservableCollection.First( user => user.id == 0); }
}
如果SelectionProperty依赖的不仅仅是ObservableCollection(也许我们想找到一个最接近某个年龄的用户,这是在其他地方设置的),那么当其他属性更改时,需要确保SelectionProperty的PropertyChanged事件也被引发。