MVVM使用命令混淆保存视图模型的更改

本文关键字:模型 视图 保存 命令 MVVM | 更新日期: 2023-09-27 18:19:10

我有一个GridView显示ObservableCollection<Models>。当我选择一个项目时,将填充TextBoxe s以允许编辑和添加新的Model s。但是,当我编辑文本框时,gridview和ViewModel会自动更新。我正试图使用按钮命令来保存/取消修订。

我已经包括了我的视图和我的ViewModel。我在这方面还是比较新的,我一直在遵循这个教程http://msdn.microsoft.com/en-us/library/ff798384.aspx,我不确定我可以改变什么,以使它按照我想要的方式工作。

当我去创建一个NewModel时,SelectedModel也随着NewModel改变。所以困惑!

我的观点:

<ListView ItemsSource="{Binding Models}" SelectedItem="{Binding SelectedModel}" 
          IsSynchronizedWithCurrentItem="True">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Models" DisplayMemberBinding="{Binding ModelName}">
            <GridViewColumn Header="Template" 
                            DisplayMemberBinding="{Binding Template.TemplateID}">
        </GridView>
    </ListView.View>
</ListView>
    <TextBox DataContext="{Binding SelectedModel}" Text="{Binding ModelName, Mode=TwoWay}"/>
    <TextBox DataContext="{Binding SelectedModel}" Text="{Binding TemplateID, Mode=TwoWay}"/>
    <Button Content="Save" Command="{Binding SaveModelCommand}" />
    <Button Content="Cancel" Command="{Binding CancelModelCommand}" />
    <Button Content="Add Model" Command="{Binding AddModelCommand}" />

我的视图模型:

private Model _selectedModel = null;
private Model _newModel = null;
private RelayCommand _addmodelcommand;
private RelayCommand _editmodelcommand;
private RelayCommand _savemodelcommand;
public Model SelectedModel
{
    get { return _selectedModel; }
    set
    {
        if (_selectedModel != value)
        {
            _selectedModel = value; RaisePropertyChanged("SelectedModel");
        }
    }
}
public Model NewModel
{
    get { return _newModel; }
    set 
    {
       _newModel = value;
       RaisePropertyChanged("NewModel");
    }
}
public RelayCommand AddModelCommand
{
    get
    {
        if (_addmodelcommand == null)
        {
           _addmodelcommand = new RelayCommand(p => SetNewModel(),
                                               p => true);
        }
        return _addmodelcommand;
    }
    set 
    { 
        _addmodelcommand = value;
        RaisePropertyChanged("AddModel");
    }
}
public RelayCommand SaveModelCommand
{
    get
    {
        if (_savemodelcommand == null)
        {
            _savemodelcommand = new RelayCommand(p => ModelSaved(), 
                                                 p => true);
        }
        return _savemodelcommand;
    }
    set
    {
        _savemodelcommand = value;
        RaisePropertyChanged("SaveModel");
    }
}
public void SetNewModel()
{
    if (NewModel == null)
    { 
       NewModel = new Model();
    }
    else
    {
       NewModel.ModelName = string.Empty; 
    }
    SelectedModel = NewModel;
}
public string ModelSaved()
{
    string error = null;
    if (error == null)
    {
        if (SelectedModel != NewModel)
        {
            UpdateModel(SelectedModel);
        }
        else //adds new model
        {
          //Add the new model to the data context.
          _ESTContext.Models.Add(NewModel);
          //Add the new model to the observable collection.
          this.Models.Add(NewModel);
          this.SelectedModel = NewModel;
          NewModel = null;
        }
        _ESTContext.SaveChanges();
    }
    return error;
}

MVVM使用命令混淆保存视图模型的更改

我注意到您正在使用EntityFramework,该框架旨在跟踪您的更改,并仅在调用_ESTContext.SaveChanges()时保存它们。所以我会改变你处理这个问题的方式。

目前,似乎你想让用户在移动到ListView中的另一个项目之前单击保存或取消。我建议你让用户点击一个项目,使用你的文本框修改它,如果他们想,点击另一个项目并修改它。用户还可以根据需要多次点击添加按钮。然后,当他们完成了所有的更改,然后点击保存按钮应该简单地做任何错误检查的所有数据(如果你想),然后调用_ESTContext.SaveChanges()。这将一次保存所有的更改。同样地,使取消按钮成为一个全局取消按钮,它可以像执行_ESTContext = new WhateverContext();一样简单地实现,然后刷新您的Models属性。

这种方法也允许用户在他们想要的时候点击保存按钮,所以理论上他们仍然可以在每次修改后保存,如果他们真的想要的话。