2015-02-19 4 views
1

Как получить сумму значения столбца ObservableCollection к другому свойству при изменении значений столбцов данных в сети, - МОФ MVVM патернПолучить сумму значения столбца ObservableCollection

+0

Вы хотите отобразить как столбик в виде сетки или сводки внизу? –

+0

Спасибо за ваш отзыв, сводка в нижней части, я хочу отобразить сумму значений столбцов конкретной сетки в нижнем блоке текста. Здесь я использую привязку данных ObservableCollection. – Sam

ответ

1

Вот решение:

Xaml:

<Window x:Class="Mvvm.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:System="clr-namespace:System;assembly=mscorlib" 
     Title="MainWindow" Height="300" Width="400" > 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="*"/> 
      <RowDefinition Height="20"/> 
     </Grid.RowDefinitions> 
     <DataGrid Grid.Row="0" 
        ItemsSource="{Binding VM.MyList}" 
        SelectedItem="{Binding VM.MyItem , Mode=TwoWay}" 
        /> 
     <TextBlock Grid.Row="1" Text="{Binding VM.Sum}"/> 
    </Grid> 
</Window> 

Просмотр моделей:

public class MainViewModel : INotifyPropertyChanged 
{ 
    #region INotifyPropertyChanged 
    public event PropertyChangedEventHandler PropertyChanged; 
    void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
    #endregion 

    public ObservableCollection<ItemViewModel> MyList { get; set; } 

    ItemViewModel _myItem; 
    public ItemViewModel MyItem 
    { 
     get 
     { 
      return _myItem; 
     } 
     set 
     { 
      _myItem = value; 
      OnPropertyChanged("MyItem"); 
      OnPropertyChanged("Sum"); 
     } 
    } 

    public int Sum 
    { 
     get 
     { 
      return MyList.Sum(a=>a.Amount); 
     } 
    } 

    public MainViewModel() 
    { 
     MyList = new ObservableCollection<ItemViewModel>(); 

     MyList.Add(new ItemViewModel { Amount = 5}); 
     MyList.Add(new ItemViewModel { Amount = 6}); 
    } 

} 

public class ItemViewModel : INotifyPropertyChanged 
    { 
     #region INotifyPropertyChanged 
     public event PropertyChangedEventHandler PropertyChanged; 
     void OnPropertyChanged(string propertyName) 
     { 
      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
     #endregion 

     int _amount; 
     public int Amount 
     { 
      get 
      { 
       return _amount; 
      } 
      set 
      { 
       _amount = value; 
       OnPropertyChanged("Amount"); 
      } 
     } 
     //Other properties like Id, transactionDate, ... 

    } 

Главный код окна позади:

public MainViewModel VM { get; set; } 
    public MainWindow() 
    { 
     InitializeComponent(); 
     VM = new MainViewModel(); 
     DataContext = this; 

    } 
+0

Итак, в этом случае ItemModel Item является вложенным классом внутри MainViewModel, который удобно, поскольку он позволяет вам запускать событие PropertyChanged для Sum из набора MyItem. Возможно ли вообще сделать это, если ViewModel для элемента в контейнере не является вложенным классом ViewModel, который предоставляет ObservableCollection? –

Смежные вопросы