MVVM使用命令混淆保存对viewmodel的更改

时间:2014-08-21 18:12:19

标签: c# wpf entity-framework mvvm

我有GridView显示ObservableCollection<Models>。当我选择一个项目时,会填充TextBoxe以允许编辑和添加新的Model。但是,当我编辑文本框时,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}" />

我的ViewModel:

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;
}

1 个答案:

答案 0 :(得分:1)

我注意到您正在使用EntityFramework,它旨在跟踪您的更改,并仅在您致电_ESTContext.SaveChanges()时保存更改。所以我会改变你接近这个的方式。

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

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