c# - 如何绑定(bind)到 ObservableCollection 的一个元素

标签 c# wpf data-binding

我有一个 ObservableCollection 并想将一个文本框绑定(bind)到该集合的特定元素。 ObservableCollection 中的项目属于实现 INotifyPropertyChanged 的​​类型。

我考虑过创建一个从 ObservableCollection 中选择正确元素的属性,但是当 Collection 中的相应元素发生变化时我必须让这个属性实现,我不确定这是否是正确的方法这个。

最佳答案

通常,尤其是如果您使用 MVVM,您将拥有一个带有 ObservableCollection 的 viewModel 和一个您使用数据绑定(bind)更新的 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

关于c# - 如何绑定(bind)到 ObservableCollection 的一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18498898/

相关文章:

javascript - 单例对象最有效的 Aurelia 绑定(bind)方式

c# - ADO Entity Framework 是否支持非 DTC 事务?一个 EntityContext 和一个 TransactionScope 中的多个查询导致 DTC 提升

c# - LINQ "not in"不工作

c# - 您应该进行多次插入调用还是传递 XML?

c# - TextBlock 文本未在 DataGridCell 中垂直居中

c# - silverlight 3.0与winforms的通信

C#-后台 worker 的 CancelAsync() 不工作?

c# - C#WPF为什么我的程序在其他计算机上崩溃?

c# - 数据绑定(bind) : Does not contain a property with then name '(columnName)'

c# - Xamarin 表单绑定(bind)到对象属性