gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 10:27:05 24 4
gpt4 key购买 nike

我对编程很陌生,目前正在学习 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com