C# MVVM : Edit a SelectedItem of an ObservableCollection with a RelayCommand

标签 c# mvvm edit selecteditem relaycommand

我对编程很陌生,目前正在学习 C# 和 MVVMC 模式(我认为这与 MVVM 模式基本相同)。

我需要为大学的 ChiliPlants 编写一个数据库工具。在那里,您应该能够编辑 ObservableCollection 中的现有项目。

我在 DataGrid 中显示的这个 ObservableCollection,请参见:DataGrid
在 DataGrid 下方有三个按钮:添加、编辑和删除。
我能够对 AddButton 以及 DeleteButton 进行编程。

不幸的是,我不知道如何对 EditButton 进行编程。
它应该会打开一个新窗口,SelectedItem 应该像这样打开:EditWindow

到目前为止,我的 EditButton 和我的 AddButton 做同样的事情。

在这里查看我的代码:

看法:

<StackPanel Grid.Row="1" Orientation="Horizontal">
        <Button Content="Add" Margin="5,5,0,5" Width="100" Command="{Binding AddCommand}" />
        <Button Content="Edit" Margin="5,5,0,5" Width="100" Command="{Binding EditCommand}" />
        <Button Content="Delete" Margin="5,5,540,5" Width="100" Command="{Binding DeleteCommand}" />
        <Button Content="Sichern" Margin="5,5,5,5" Width="100" Command="{Binding SaveCommand}" />
</StackPanel>

View 模型:
    private ICommand _editCommand;

    public ICommand EditCommand
    {
        get { return _editCommand; }
        set { _editCommand = value; }
    }

Controller :
public void SDInitialize()                                          
    {
        var view = new WindowStammdatenverwaltung();

        mViewModel = new WindowStammdatenverwaltungViewModel
        {
            EditCommand = new RelayCommand(EditCommandExecute, EditCommandCanExecute)
        };
        view.DataContext = mViewModel;
        view.ShowDialog();
    }

private void EditCommandExecute(object obj)
    {
        var editedObject = new WindowEditController().EditChiliModel();
        if (editedObject != null)
        {
            mViewModel.Stock.Add(mViewModel.SelectedChili);
        }
    }

private bool EditCommandCanExecute(object obj)
    {
        return mViewModel.SelectedChili != null;
    }

问题在于 EditCommandExecute。目前我刚刚将 AddCommandExecute 的代码放在那里。不幸的是,我不知道如何编写这样的 EditCommandExecute。

我的 WindowEditController 看起来像这样:
public class WindowEditController
{
    WindowEdit mView;

    public ChiliModel EditChiliModel()
    {
        mView = new WindowEdit();
        WindowEditViewModel mViewModel = new WindowEditViewModel
        {
            ChiliModel = new ChiliModel(),
            OkCommand = new RelayCommand(ExecuteOkCommand),
            CancelCommand = new RelayCommand(ExecuteCancelCommand),
        };
        mView.DataContext = mViewModel;
        if (mView.ShowDialog() == true)
        {
            return mViewModel.ChiliModel;
        }
        else
        {
            return null;
        }
    }

    private void ExecuteOkCommand(object obj)
    {
        mView.DialogResult = true;
        mView.Close();
    }

    private void ExecuteCancelCommand(object obj)
    {
        mView.DialogResult = false;
        mView.Close();
    }

我知道,我可以让用户在 DataGrid 中编辑 SelectedItem,但这在我的任务中是不允许的......

我可以使用与 AddCommand 相同的窗口吗?基本上它们看起来应该是一样的,EditWindow 应该已经包含了 SelectedItem 的信息。

我几乎查找了与此主题类似的所有条目,但没有找到简单的解决方案。或者我能够以我糟糕的编码技能理解的解决方案:( ...

如果你们能帮助我,我会很高兴。请为这个新手保持简单:)

我已经尝试过的:

我尝试将 CommandParameter 添加到我的 Button,如下所示:CommandParameter="{Binding SelectedItem, ElementName=StockDataGrid}" 但这仍然没有打开包含 SelectedItem 数据的窗口。它只是为新项目打开了一个全新的窗口。

最佳答案

使用CommandParameter在 Command 属性之后,并将其绑定(bind)到 SelectedItemDataGrid .

例如,假设您 DataGrid具有属性 Name=MyDataGrid .
Button变成:

<Button Content="Edit"
        Margin="5,5,0,5"
        Width="100"
        Command="{Binding EditCommand}"
        CommandParameter="{Binding SelectedItem, ElementName=MyDataGrid}"/>

EditCommandExecute(object obj)被执行,obj实际上是当前的SelectedItem你要的那个。

关于C# MVVM : Edit a SelectedItem of an ObservableCollection with a RelayCommand,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37501794/

相关文章:

c# - 在 API 代码中,对列表类型 C# 属性使用私有(private) setter 是个好主意吗?

c# - 将 M-V-VM 与 WPF 结合使用,如何在给定 ViewModel 的情况下实例化对话框 View ?

wpf - 如何使用 WPF MVVM 回滚组合框的选定 SelectedValue

ios - 更改 CoreData 记录,SwiftUI

asp.net - 从 ASP.NET 中的 Gridview 获取当前行

delphi - 如何更改 TEdit 默认错误消息(NumbersOnly 模式)?

c# - 在多级 wpf View 中验证子记录

c# - 已将证书导入根权限,但仍无法建立信任关系

c# - XML 模式 - 哪个更正确?

mvvm - 哪种方法使用MVVM或静态