【问题标题】:MVVM ObservableCollection inside a ObservableCollection (ViewModel)ObservableCollection (ViewModel) 中的 MVVM ObservableCollection
【发布时间】:2014-04-07 08:06:36
【问题描述】:

我只是想知道如何拥有父集合的子集合?

例如,

我已经有一个产品的 ObservableCollection,它正在正确地添加并绑定到 XAML。但是,现在我需要另一个包含产品项目的 ObservableCollection。

基本上我正在考虑在视图模型中拥有类似的东西

 ProductCollection[0].ProductItemCollection.Add(newProductitem);

我将如何在 MVVM 中解决这个问题?

谢谢

克里斯

【问题讨论】:

  • 您想对 xaml 的“ProductItem”集合做什么?此外,我假设将您的“产品”集合绑定到 xaml 意味着您将其绑定到某些 ItemsControl。
  • 嗨 samar,是的,产品已绑定到 DataGrid。我将为每个产品创建另一个产品数据网格。当用户点击产品行时,会出现一个产品项目网格,其中将包含该产品的所有项目

标签: c# wpf mvvm observablecollection


【解决方案1】:

不确定这是否是您要找的,但是...

假设您的 xaml 中有两个网格。第一个显示您的产品,第二个显示所选产品的项目。

<Window x:Class="WpfApplication1.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>
    <Grid.RowDefinitions>
        <RowDefinition Height="173*" />
        <RowDefinition Height="147*" />
    </Grid.RowDefinitions>

    <DataGrid ItemsSource="{Binding ProductsCollection}"
              SelectedItem="{Binding SelectedProduct}"
              Margin="10">
    </DataGrid>

    <DataGrid ItemsSource="{Binding ProductItemsCollection}"
              Margin="10"
              Grid.Row="1">
    </DataGrid>

</Grid>

你已经声明了类

public class Product
{
    public Product()
    {
        ItemsCollection = new ObservableCollection<Item>();
    }
    public int ID { get; set; }
    public string Name { get; set; }
    public ObservableCollection<Item> ItemsCollection { get; set; }
}

public class Item
{
    public int ID { get; set; }
    public DateTime Date { get; set; }
}

从第一个网格中选择一个产品将更新 VM 中第二个网格的 itemsource,如下所示

    private ObservableCollection<Product> _ProductsCollection = new ObservableCollection<Product>();
    public ObservableCollection<Product> ProductsCollection
    {
        get{return _ProductsCollection;}
        set
        {
            _ProductsCollection = value;
            OnPropertyChanged("ProductsCollection");
        }
    }

    private ObservableCollection<Item> _ProductItemsCollection;
    public ObservableCollection<Item> ProductItemsCollection
    {
        get {return _ProductItemsCollection; }
        set
        {
            _ProductItemsCollection = value;
            OnPropertyChanged("ProductItemsCollection");
        }
    }

    private Product _SelectedProduct = null;
    public Product SelectedProduct
    {
        get {return _SelectedProduct;}
        set
        {
            _SelectedProduct = value;
            ProductItemsCollection = _SelectedProduct.ItemsCollection;
            OnPropertyChanged("SelectedProduct");
        }
    }

最后你添加了一些示例数据

    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = this;

        Product product1 = new Product() { ID = 1, Name = "Product1" };
        product1.ItemsCollection.Add(new Item() { ID = 1, Date = DateTime.Now});
        product1.ItemsCollection.Add(new Item() { ID = 2, Date = DateTime.Now.AddDays(-1) });

        Product product2 = new Product() { ID = 2, Name = "Product2" };
        product2.ItemsCollection.Add(new Item() { ID = 3, Date = DateTime.Now });
        product2.ItemsCollection.Add(new Item() { ID = 4, Date = DateTime.Now.AddDays(-2) });

        ProductsCollection.Add(product1);
        ProductsCollection.Add(product2);
    }

【讨论】:

  • 感谢您提供 Raptis 示例。但是,在我使用 MVVM 的第三天,我认为您在 VM 内完成了所有“收集逻辑”。所以基本上你放在主窗口中的所有东西都可以进入虚拟机?
  • 是在虚拟机上。提供一个您认为应该如何的示例,我们可以查看一下。
  • 对不起,你的权利,我想说忽略那条评论。谢谢。那么最好使用 XAML 来查找选定的 Item 吗?我用 C# 说 var selectedItem = Grid.SelectedItem as Product.. 我猜 XAML 的重点是尽可能多地使用它?
  • 你明白了!你可以像“var selectedItem = Grid.SelectedItem as Product”那样做,但这意味着VM知道数据网格。但它不应该。您会发现 xaml 中有一个绑定属性,用于在 xaml 和 VM 之间进行通信所需的所有内容。我认为最常用的是 ItemsSource 和 SelectedItem。
  • @user3428422 如果您正在寻找答案,请接受。谢谢!
猜你喜欢
  • 1970-01-01
  • 2013-05-09
  • 2023-03-17
  • 2011-07-04
  • 2011-05-11
  • 1970-01-01
  • 2013-09-18
  • 2014-06-26
  • 1970-01-01
相关资源
最近更新 更多