C#MVVM:使用RelayCommand编辑ObservableCollection的SelectedItem

时间:2016-05-28 17:16:32

标签: 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>

视图模型:

    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数据的窗口。它刚刚为新物品打开了一个全新的窗口。

1 个答案:

答案 0 :(得分:2)

在Command属性后面使用CommandParameter,然后将其绑定到SelectedItem的{​​{1}}。

例如,假设您DataGrid具有属性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