自我删除Viewmodel详细视图 - 糟糕的做法?

时间:2013-03-26 20:55:26

标签: c# .net xaml mvvm viewmodel

我有一个主 - 详细信息应用程序,其中详细视图模型/视图可以执行删除命令。

但是如何通知master-viewmodel中的master-collection删除了detail-viewmodel并且必须从集合中删除?

这是一个糟糕的设计而且master-viewmodel必须删除细节吗? 或者是通过活动做到这一点的唯一选择? MVVM符合吗?

这是一个缩短的代码

视图模型

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主站

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

XAML的详细

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

1 个答案:

答案 0 :(得分:1)

祝你好运!

您可以通过多种方式实现这一目标(我喜欢A和D解决方案):

A. 详细视图模型具有指向主要详细信息视图模型(某个方法void RemoveDetail(MetalTransactionViewModel detail)的轻型界面)或“详细信息视图模型集”的链接。 例如(链接到集合):

详细信息视图模型:

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 Toolkit,则可以使用Messenger类通知主视图模型删除操作。

<强> d。将删除命令移动到主视图模型。我认为在这种情况下这是最好的解决方案。我相信主视图模型必须操纵收集详细信息视图模型。

我希望它会对你有所帮助!