【问题标题】:C# MVVM: Edit a SelectedItem of an ObservableCollection with a RelayCommandC# MVVM:使用 RelayCommand 编辑 ObservableCollection 的 SelectedItem
【发布时间】:2016-05-28 17:16:32
【问题描述】:

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

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

这个 ObservableCollection 我显示在一个 DataGrid 中,看这个: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>

视图模型:

    private ICommand _editCommand;

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

控制器:

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 的信息。

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

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

我已经尝试过的:

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

【问题讨论】:

    标签: c# mvvm edit selecteditem relaycommand


    【解决方案1】:

    在 Command 属性之后使用CommandParameter,并将其绑定到DataGridSelectedItem

    例如,假设您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

    【讨论】:

    • 不幸的是,这在我的解决方案中不起作用,也许我做错了什么,但是从您的建议中添加 CommandParameter 是行不通的。我还尝试关注CommandParameter"{Binding SelectedChili}"(这是绑定到我的 DataGrid 的 SelectedItem 属性的属性)和"{Binding SelectedChili, ElementName=StockDataGrid}" 我担心必须进行其他更正。我会在问题中添加一些额外的代码。
    • 如果您在EditCommandExecute 中以正确的方式使用数据,它将起作用 - 不要添加新条目,用现有数据填充AddWindow,稍后如果用户单击确定,获取更改的数据并更新传递给您的命令的项目。无论如何,您都需要创建EditWindow,因为用户不会期望在名为 Hinzufügen 的窗口中编辑数据 :-)
    • @Haukinger 你能帮我吗?我不知道该怎么做你所描述的......我现在制作了一个名为 WindowEdit 的新窗口、一个 WindowEditViewModel 和一个 WindowEditController。我还将更新我的问题中的代码。非常感谢您。
    • 我将获取命令参数,获取数据,将其放入 EditWindowViewModel,显示 EditWindow,最后,如果用户单击 Ok,则从视图模型中获取数据并将其放回在命令参数中。如果你想进一步讨论这个问题,你可以通过 haukinger dot de 的 stackoverflow 给我发电子邮件,我想这比在此处对劫持的答案进行评论讨论更可取,我想......
    • 一个问题:SelectedChili 属性引发更改通知?第二个问题:什么不适用于 CommandParameter?检查 Visual Studio 中的输出控制台,看看是否有一些绑定错误(如果 WPF 的绑定引擎找不到您指定的源属性,则会发生这种情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-20
    • 1970-01-01
    • 2020-09-16
    • 1970-01-01
    • 2013-11-07
    • 2014-02-14
    • 1970-01-01
    相关资源
    最近更新 更多