1 using Microsoft.Toolkit.Mvvm.ComponentModel;
2 using System;
3 using System.Collections.Generic;
4 using System.Collections.ObjectModel;
5 using System.Collections.Specialized;
6 using System.ComponentModel;
7 using System.Linq;
8 using System.Text;
9 using System.Threading.Tasks;
11 namespace MVVMToolkit框架学习.ViewModels
12 {
13 /// <summary>
14 /// 条目数据
15 /// </summary>
16 public class MaterialItem : ObservableObject
17 {
18 private double _price;
20 public string Name { get; set; }
22 public double Price
23 {
24 get => _price;
25 set => SetProperty(ref _price, value);
26 }
28 public string Description { get; set; }
29 }
31 public class ObservableCollectionVM : ObservableObject
32 {
33 private double _price;
35 private ObservableCollection<MaterialItem> _materialItems;
37 public ObservableCollection<MaterialItem> MaterialItems
38 {
39 get => _materialItems;
40 set => SetProperty(ref _materialItems, value);
41 }
43 public double Price
44 {
45 get => _price;
46 set => SetProperty(ref _price, value);
47 }
49 public ObservableCollectionVM()
50 {
51 MaterialItems = new ObservableCollection<MaterialItem>();
52 MaterialItems.CollectionChanged += (s, e) =>
53 {
54 //监听元素变更事件,或者可以直接ForEach遍历所有的Item
55 switch (e.Action)
56 {
57 case NotifyCollectionChangedAction.Add:
58 foreach (var item in e.NewItems)
59 {
60 //挂载属性变更方法
61 (item as INotifyPropertyChanged).PropertyChanged += (s, e) =>
62 {
63 Price = MaterialItems.Sum(x => x.Price);
64 };
65 }
66 break;
68 case NotifyCollectionChangedAction.Remove:
69 case NotifyCollectionChangedAction.Replace:
70 case NotifyCollectionChangedAction.Move:
71 case NotifyCollectionChangedAction.Reset:
72 default:
73 break;
74 }
75 };
77 MaterialItems.Add(new MaterialItem() { Name = "玻璃" });
78 MaterialItems.Add(new MaterialItem() { Name = "大理石" });
79 MaterialItems.Add(new MaterialItem() { Name = "地板" });
80 }
81 }
xaml代码
1 <Window
2 x:Class="MVVMToolkit框架学习.Views.ObservableCollectionView"
3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
5 xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
6 xmlns:local="clr-namespace:MVVMToolkit框架学习.Views"
7 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
8 xmlns:vm="clr-namespace:MVVMToolkit框架学习.ViewModels"
9 Title="ObservableCollectionView"
10 Width="800"
11 Height="450"
12 d:DataContext="{d:DesignInstance Type={x:Type vm:ObservableCollectionVM}}"
13 mc:Ignorable="d">
14 <Grid>
15 <Grid.RowDefinitions>
16 <RowDefinition Height="2*" />
17 <RowDefinition Height="8*" />
18 </Grid.RowDefinitions>
19 <StackPanel
20 HorizontalAlignment="Center"
21 VerticalAlignment="Center"
22 Orientation="Horizontal">
23 <TextBlock
24 FontSize="25"
25 Text="总价" />
26 <TextBlock
27 Margin="15,0,0,0"
28 FontSize="25"
29 Text="{Binding Price, UpdateSourceTrigger=PropertyChanged}" />
30 </StackPanel>
32 <DataGrid
33 Grid.Row="1"
34 HorizontalAlignment="Center"
35 ItemsSource="{Binding MaterialItems}" />
36 </Grid>
37 </Window>