Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVVM使用命令保存对viewmodel的更改_C#_Wpf_Entity Framework_Mvvm - Fatal编程技术网

C# MVVM使用命令保存对viewmodel的更改

C# MVVM使用命令保存对viewmodel的更改,c#,wpf,entity-framework,mvvm,C#,Wpf,Entity Framework,Mvvm,我有一个网格视图显示一个可观察的集合。当我选择一个项目时,将填充文本框s,以允许编辑和添加新的模型s。但是,当我编辑文本框时,gridview和ViewModel会随着修订自动更新。我尝试使用按钮命令来保存/取消修订 我已经包括了我的视图和视图模型。我在这方面还是比较新的,我一直在学习这个教程,我不确定我能做些什么来让它按照我想要的方式工作 当我去创建一个新模型时,SelectedModel也会随着新模型而改变。真糊涂 我的看法是: <ListView ItemsSource="{Bind

我有一个
网格视图
显示一个
可观察的集合
。当我选择一个项目时,将填充
文本框
s,以允许编辑和添加新的
模型
s。但是,当我编辑文本框时,gridview和ViewModel会随着修订自动更新。我尝试使用按钮命令来保存/取消修订

我已经包括了我的视图视图模型。我在这方面还是比较新的,我一直在学习这个教程,我不确定我能做些什么来让它按照我想要的方式工作

当我去创建一个新模型时,SelectedModel也会随着新模型而改变。真糊涂

我的看法是:

<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}" />

我注意到您正在使用EntityFramework,它旨在跟踪您的更改,并且仅在您调用
\ESTContext.SaveChanges()
时保存更改。所以我会改变你处理这件事的方式

目前,您似乎想让用户在转到ListView中的其他项目之前单击“保存”或“取消”。我建议您让用户单击一个项目,使用文本框修改它,如果他们愿意,单击另一个项目并修改该项目。用户还可以根据需要多次单击“添加”按钮。然后,在完成所有更改后,单击“保存”按钮只需对所有数据执行任何错误检查(如果需要),然后调用
\est context.SaveChanges()
。这将一次保存所有更改。类似地,将cancel按钮设置为全局取消按钮,可以像执行
\u ESTContext=new WhateverContext()一样实现
然后刷新您的
模型
属性


这种方法还允许用户随时单击“保存”按钮,这样,理论上,如果用户确实愿意,每次修改后都可以保存。

您无需通知从未更改的属性的更改。这包括返回命令的属性,您可以延迟初始化它们,setter是多余的。
ListView
不推荐使用,而是使用
DataGrid
CanUserAddRows=“True”
,它应该以最少的开发完成这项工作。Hmmm。我懂了。我注意到了这一点,但是如果我想允许用户一次编辑/添加一个呢?我是否可以在viewmodel中创建一个新的模型对象,并在单击“保存”时将其插入主viewmodel?但这仅适用于新模型,因为您必须将文本框绑定到
AddedModel
属性。这样做有什么不对?那么,您将如何修改现有的
模型
?您必须有两组文本框,因为每个文本框只能有一个绑定。根据您的评论,使用DataGrid而不是ListView最有好处。查看这个关于datagrids的超级简单教程:这是第3部分的第一部分。我明白了,第二部分和第三部分对你最有用。谢谢你的洞察力。谢谢。我正在考虑打开一个对话框,将值传入和传出。我会尝试一下,如果不可能,我想我只能坚持你的建议。
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;
}