1

詳細ビューモデル/ビューに削除コマンドを実行する機能があるマスター/詳細アプリケーションがあります。

しかし、どうすればmaster-viewmodelのmaster-collectionに、detail-viewmodelが削除され、コレクションから削除する必要があることを通知できますか?

これは悪いデザインであり、master-viewmodelは詳細を削除する必要がありますか?または、イベントを介してこれを行う唯一のオプションですか?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マスター

<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}" />
4

1 に答える 1

1

良い一日を!

あなたはいくつかの方法でそれを行うことができます(私はAとDのソリューションが好きです):

A.詳細ビューモデルには、マスター詳細ビューモデル(1つのメソッドを備えた一部のライトインターフェイス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 Light Toolkitなどのmvvmツールキットを使用している場合は、Messengerクラスを使用して、マスタービューモデルに削除アクションを通知できます。

D.削除コマンドをメインビューモデルに移動します。この場合、それが最も良い解決策だと思います。メインビューモデルはコレクション詳細ビューモデルを操作する必要があると思います

お役に立てば幸いです。

于 2013-03-26T22:46:17.307 に答える