在详细视图中自删除视图模型——糟糕的做法

本文关键字:视图 删除 模型 | 更新日期: 2023-09-27 18:05:56

我有一个主-细节应用程序,其中的细节视图模型/视图具有执行删除命令的能力。

但是我如何通知主视图模型中的主集合,详细视图模型被删除并且必须从集合中删除?

这是一个糟糕的设计,主视图模型必须删除细节?还是唯一的选择是通过事件来实现?MVVM符合吗?

这里是缩短的代码

ViewModel

public class AllMetalTransactionViewModel : WorkspaceViewModel
{
    private ObservableCollection<MetalTransactionViewModel> _metalTransactions;
    public ObservableCollection<MetalTransactionViewModel> MetalTransactions
    {
        get { return _metalTransactions; }
        set
        {
            if (Set("MetalTransactions", ref _metalTransactions, value))
            {
            }
        }
    }
    private MetalTransactionViewModel _selectedMetalTransaction;
    public MetalTransactionViewModel SelectedMetalTransaction
    {
        get { return _selectedMetalTransaction; }
        set
        {
            if (Set("SelectedMetalTransaction", ref _selectedMetalTransaction, value))
            {
            }
        }
    }
}
public class MetalTransactionViewModel : WorkspaceViewModel
{
    private RelayCommand _deleteCommand;
    public RelayCommand DeleteCommand
    {
        get
        {
            return _deleteCommand
                   ?? (_deleteCommand = new RelayCommand(
                        () =>
                            {
                                if (!IsNewUnit)
                                {
                                    _dataService.DeleteMetalTransaction(_metalTransaction, CallbackDelete);
                                    _dataService.CommitAllChanges(delegate(bool b, object o) {  });
                                    // How can I inform the AllMetalTransactionViewModel that I'm deleted? Event?
                                }
                            },
                        () => !IsNewUnit));
        }
    }
}

XAML-Master

<View:MetalTransactionView Grid.Column="1" 
DataContext="{Binding SelectedMetalTransaction}"></View:MetalTransactionView>

XAML-Detail

<Button DockPanel.Dock="Right" HorizontalAlignment="Right" 
Padding="5" Content="Löschen" Margin="5" Width="80" 
Command="{Binding Path=DeleteCommand}" />

在详细视图中自删除视图模型——糟糕的做法

祝你好运!

你可以用几种方法(我喜欢A和D解决方案):

详细视图模型有一个链接到主详细视图模型(一些带有一个方法void RemoveDetail(MetalTransactionViewModel detail)的轻接口)或详细视图模型集合。例如(这里有指向集合的链接):

Details View Model:

public class MetalTransactionViewModel : WorkspaceViewModel
{
    private RelayCommand _deleteCommand;
    IList<MetalTransactionViewModel> ParentCollection { get; }
public RelayCommand DeleteCommand
    {
        get
        {
            return _deleteCommand
                   ?? (_deleteCommand = new RelayCommand(
                        () =>
                            {
                                if (!IsNewUnit)
                                {
                                    _dataService.DeleteMetalTransaction(_metalTransaction, CallbackDelete);
                                    _dataService.CommitAllChanges(delegate(bool b, object o) {  });
                                     if (ParentCollection == null) { return; }
if (ParentCollection.Contains(this)) { ParentCollection.Remove(this); }
                                }
                            },
                        () => !IsNewUnit));
        }
    }
}

在主视图模型中,当创建详细视图模型时:

private MetalTransactionViewModel CreateDetailViewModel()
{
  return new MetalTransactionViewModel() { ParentCollection = MetalTransactions };
}

B。按您所说的使用事件(但是要小心,因为它可能会给您带来内存泄漏)。请查看WeakEventManager

C。如果你正在使用mvvm工具包,比如mvvm Light工具包,你可以使用Messenger类通知主视图模型移除动作。

D。将"移除"命令移至主视图模型。我想这是这种情况下最好的解决方案。我相信主视图模型必须操作集合细节视图模型

我希望它会帮助你!