我想在我的WPF項目上使用實體框架獲取/操作數據來實現MVVM模式。 我很困惑,我想知道在哪裏驗證我的模型對象集合到數據庫的變化應該是? 我的應用程序如下:在我看來,我有一個人的數據網格,兩個文本框,將加載所選人員的姓名,一個按鈕更新行更改和一個按鈕刪除選定的行。使用實體框架實現MVVM模式 - 添加刪除
在我的ModelView中,我有一個observableCollection,它將在我的數據庫(實體)+兩個用於添加/刪除按鈕的繼電器命令(請查看下面的代碼)的類初始化時加載。
的問題是,我不明白MVVM,何時何地以及如何對我的數據的修改應推到數據庫的良好的理念是什麼? 現在,當我更新我的數據庫中的一行,並且將我的數據庫上下文修改保存在我的observable集合上時,但是當我刪除一個項目時它不是cdase,我必須在數據庫中手動查找它並將其刪除(我已經將我的observablecollection附加到一個NotifyCollectionChangedEventHandler事件來處理這個事件)...我沒有明白使用Observable集合的意義!
是否有使用數據庫中的數據「完美」的MVVM架構的任何簡單的解釋??? 謝謝! 我的ViewModel
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections.ObjectModel;
using System.Windows.Data;
using System.ComponentModel;
using System.Windows.Input;
using System.Windows;
using MVVMOK.Models;
using MVVMOK.Base;
using System.Collections.Specialized;
namespace MVVMOK.ViewModel
{
class MainWindowViewModel : ViewModelBase
{
private DW_MargoEntities contexte;
//Constructor
public MainWindowViewModel()
{
contexte = new DATABASEEntities();
collectionOfCollaborators = new ObservableCollection<Collaborator>();
foreach (Collaborator c in contexte.Collaborator)
{
collectionOfCollaborators.Add(c);
}
//Abonnement pour l'ajout ou la suppression d'éléments :
collectionOfCollaborators.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(collectionOfCollaboratorsChanged);
//Assignation des commandes :
this._deleteComand = new RelayCommand(new Action<object>(DeleteRow));
this._updateCommand = new RelayCommand(new Action<object>(UpdateDB));
}
//liste des propriétés publiques:
//Propriété pour représenter l'élément séléctionné du datagrid
private Collaborator selectedItem;
public Collaborator _selectedItem
{
get { return selectedItem; }
set
{
if (value != selectedItem)
{
selectedItem = value;
OnPropertyChanged("_selectedItem");
};
}
}
//Propriété pour représenter l'élément séléctionné:
private ObservableCollection<Collaborator> collectionOfCollaborators;
public ObservableCollection<Collaborator> _collectionOfCollaborators
{
get { return collectionOfCollaborators; }
set
{
this.collectionOfCollaborators = value;
OnPropertyChanged("_collectionOfCollaborators");
}
}
//Commandes :
public ICommand _updateCommand
{
get;
set;
}
public ICommand _deleteComand
{
get;
set;
}
void collectionOfCollaboratorsChanged(object sender, NotifyCollectionChangedEventArgs e)
{
Collaborator f = new Collaborator();
switch (e.Action)
{
case NotifyCollectionChangedAction.Add:
for(int i = 0; i<e.NewItems.Count;i++)
{
if (e.NewItems[i].GetType().Equals(f.GetType()))
{
contexte.Collaborator.Add(e.NewItems[i] as Collaborator);
}
}
contexte.SaveChanges();
break;
case NotifyCollectionChangedAction.Remove:
for (int i = 0; i < e.OldItems.Count; i++)
{
if (e.OldItems[i].GetType().Equals(f.GetType()))
{
contexte.Collaborator.Remove(e.OldItems[i] as Collaborator);
}
}
contexte.SaveChanges();
break;
//Reset = Clear
}
}
//Services :
public void UpdateDB(object msg)
{
contexte.SaveChanges();
}
public void DeleteRow(object msg)
{
_collectionOfCollaborators.Remove(_selectedItem);
contexte.SaveChanges();
}
}
}
我的模型
namespace MVVMOK.Models
{
using System;
using System.Collections.Generic;
public partial class Collaborator
{
public int Id { get; set; }
public string Name { get; set; }
public string Surname { get; set; }
}
}
我的XAML
<Window x:Class="MVVMOK.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:MVVMOK.ViewModel"
Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
<!-- Declaratively create an instance of our SongViewModel -->
<local:MainWindowViewModel />
</Window.DataContext>
<Grid>
<Grid Height="237" HorizontalAlignment="Left" Margin="12,12,0,0" Name="grid1" VerticalAlignment="Top" Width="479">
<DataGrid AutoGenerateColumns="False" Height="237" HorizontalAlignment="Left" Name="dataGrid1" VerticalAlignment="Top" Width="479" ItemsSource="{Binding Path=_collectionOfCollaborators, Mode=TwoWay}" SelectionMode="Single" SelectedItem="{Binding Path=_selectedItem, Mode=TwoWay}" >
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Path=Id}" Header="ID" />
<DataGridTextColumn Binding="{Binding Path=Name}" Header="Name" Width="4*" />
</DataGrid.Columns>
</DataGrid>
</Grid>
<TextBox Height="23" HorizontalAlignment="Left" Margin="104,255,0,0" Name="textBox1" VerticalAlignment="Top" Width="120" Text ="{Binding Path=_selectedItem.Name, Mode=TwoWay}" />
<TextBox Height="23" HorizontalAlignment="Left" Margin="104,283,0,0" Name="textBox2" VerticalAlignment="Top" Width="120" Text ="{Binding Path=_selectedItem.Surname, Mode=TwoWay}" />
<Label Content="Name" Height="28" HorizontalAlignment="Left" Margin="50,255,0,0" Name="label1" VerticalAlignment="Top" />
<Label Content="Surname" Height="28" HorizontalAlignment="Left" Margin="37,283,0,0" Name="label2" VerticalAlignment="Top" />
<Button Content="Delete Row" Height="23" HorizontalAlignment="Left" Margin="416,260,0,0" Name="button1" VerticalAlignment="Top" Width="75" Command="{Binding Path=_deleteComand}"/>
<Button Content="Update All" Height="23" HorizontalAlignment="Left" Margin="335,260,0,0" Name="button2" VerticalAlignment="Top" Width="75" Command="{Binding Path=_updateCommand}"/>
</Grid>
</Window>
實際上,爲什麼我沒有看到結果是因爲ObservableCollection僅在更新元素(如我在某些論壇和討論中看到的)時才通知,而不是在添加或刪除實體時通知... The MSDN文檔真的很模糊! – Mohtaa 2013-02-19 12:20:51