Ajouter des données à la base de données en utilisant le pattern MVVM
Je suis en train d'Enregistrer les Données dans la base de données.
Supposons que j'ai une Table Nommée Customers
de trois champs:
Id
FirstName
LastName
J'ai créé mes modèles à l'aide de ADO.Net Modèle de Données d'Entité.
Voici mon ViewModel code
public class myViewModel : INotifyPropertyChanged
{
private string _firstName;
public string FirstName
{
get
{
return _firstName;
}
set
{
_firstName = value;
OnPropertyChanged("FirstName");
}
}
private string _lastName;
public string LastName
{
get
{
return _lastName;
}
set
{
_lastName = value;
OnPropertyChanged("LastName");
}
}
protected virtual void OnPropertyChanged(string PropertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(PropertyName));
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
Voici ma MainWindow.fichier xaml:
<Window x:Class="Lab_Lite.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="clr-namespace:Lab_Lite.ViewModels"
Title="MainWindow" Height="350" Width="525" WindowState="Maximized">
<Window.DataContext>
<vm:MainWindowViewModel />
</Window.DataContext>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Row="0" Grid.Column="0" Text="FirstName" />
<TextBox Grid.Row="0" Grid.Column="1" Text="{Binding FirstName, Mode=TwoWay, UpdateSourceTrigger=Explicit}" />
<TextBlock Grid.Row="1" Grid.Column="0" Text="LastName" />
<TextBox Grid.Row="1" Grid.Column="1" Text="{Binding LastName, Mode=TwoWay, UpdateSourceTrigger=Explicit}" />
<Button Grid.Row="2" Grid.Column="1" Content="Save" />
</Grid>
</Window>
J'ai deux problèmes ici:
1) How my ViewModel knows that FirstName property declared in ViewModel is
referenced to FirstName Column in my database?
2) How to save changes to database when UpdateSourceTrigger is set to Explicit?
Je pense avoir trouvé la réponse à la 2ème question jusqu'à une certaine mesure, à l'aide de la Commande. Mais je ne sais pas si c'est bon ou pas car je ne sais pas la réponse à ma première question.
Mise à jour:
Supposons que j'ai deux tables comme ceci :
Client:
CustomerID
Name
GenderID //Foreign Key
Genre :
GenderID
Value
Maintenant ce que doit être la valeur de CurrentCustomer.Gender
dans SaveCustomerChanges
Méthode ?
OriginalL'auteur Khushi | 2013-12-09
Vous devez vous connecter pour publier un commentaire.
Je vous recommande fortement d'utiliser un ORM comme Cadre de l'Entité (EF) à l'aide de la base de données-d'abord, puisque vous avez déjà créé une base de données. Entity Framework permettra de créer votre POCO (classes de modèle de la Plaine de Vieux Objets C#) automatiquement pour vous et vous aussi créez une classe nommée
**YourDbName**Context
qui est votreDbContext
. À ce stade, votre application va créer une instance de vous contexte à chaque fois que vous exécutez votre application, et vous serez en mesure d'accéder à votre base de données à l'aide du contexte. EF permettra également de garder une trace de toutes les modifications que vous faites donc, ici, est de savoir comment vous le problème serait résolu:EF génère POCO:
Dans votre viewmodel vous pouvez récupérer un
List<Customer>()
à partir de votre base de données.Alors maintenant, vous avez deux options dans le viewmodel:
Pour être naturel MVVM vous ne devriez pas lier CurrentCustomer à la vue. Cela ne veut pas suivre le modèle. Afin de résoudre ce problème, vous créez des propriétés distinctes, tout comme vous avez ci-dessus, et vous pouvez soit retourner
CurrentCustomer.PropertyName
de la lecture et de l'utiliser dans le setter de la sorte:En faisant cela, vous n'aurez pas à vous soucier de la cartographie du viewmodel de la propriété à l'POCO de propriété, toutefois, toute modification que vous apportez dans la vue à cause maintenant Entity Framework pour suivre le changement, dans ce cas tout ce que vous devez faire maintenant, dans la méthode save est appel
dbContext.SaveChanges();
.Si vous voulez être en mesure de faire une sorte d'annuler ou annuler, puis garder vos propriétés définies de la façon que vous l'avez maintenant:
et dans votre méthode de sauvegarde, vous aurez à la carte le viewmodel de propriétés à la CurrentCustomer de propriétés devrait alors entraîner un changement à suivre:
À ce stade, les changements devraient avoir revu et mis à jour les tables de base de données.
Maintenant, si vous n'êtes pas à l'aide de Entity Framework, vous aurez besoin de mettre en place une sorte de couche d'accès aux données à laquelle vous pouvez passer une
Customer
objet et ensuite, vous aurez besoin de récupérer l'objet à partir de votre base de données et mise à jour de ses valeurs.Découvrez ce que bien!
EDIT:
Pour appeler
SaveCustomerChanges()
vous aurez besoin de fil de cette méthode à l'aide deICommand
.D'abord créer un
RelayCommand
Classe:Maintenant dans votre viewmodel:
Dans votre viewmodel constructeur
Puis associer SaveChangesCommand en XAML:
Maintenant, lorsque vous cliquez sur Enregistrer la commande doit incendie de la
SaveCustomerChanges()
méthode.Besoin d'utiliser ICommand au fil de votre bouton enregistrer de la méthode. Jetez un oeil ci-dessus, j'ai posté un exemple. Cela peut aussi être utilisé pour votre bouton annuler.
Je vous remercie pour votre temps et de travail acharné. Cela fonctionne parfaitement bien.
pas de problème..consultez ce lien, elle est très bien informé sur WPF et a de bons articles à lire: rachel53461.wordpress.com/2011/05/08/simplemvvmexample
J'obtiens une erreur que certains arguments de
SaveCustomerChanges
n'est pas valide dans cette ligneSaveChangesCommand = new RelayCommand(SaveCustomerChanges);
. J'ai donc ajouté un paramètre du type d'objet à la SaveCustomerChanges méthode que nous avons créé précédemment. maintenant, il fonctionne très bien. Maintenant j'ai un autre problème. Je vais mettre à jour ma question un peu.OriginalL'auteur TMan