0

を表示する DataGrid がありますObservableCollection<Worker>。セルをダブルクリックすると、新しいウィンドウが開き、選択したセルに関するデータが表示されWorker、ユーザーは特定のプロパティを変更できます。この子ウィンドウには、[同意する] ボタンと [キャンセル] ボタンがあります。Worker私の意図は、「同意する」または「キャンセル」がクリックされるまで、変更を一時的なものにすることです。「同意する」がクリックされた場合、これらの変更を永続的に行い、「キャンセル」がクリックされた場合はそれらを破棄してもらいたいです。私はまだこれを行う方法を見つけることができませんでした。がExecuteHireCommandアクティブになると、データはすぐにメイン プロジェクトに送り返されます。[同意する] をクリックしたときにのみ変更を永続的にする方法が必要です。アドバイスをいただければ幸いです。

public class WorkerWindowViewModel : ViewModelBase
{
    #region Members

    private Worker _worker;

    #endregion

    #region Properties

    public string WindowKey { get; set; }

    public Worker Worker
    {
        get { return _worker; }
        set
        {
            if (_worker == value)
                return;
            _worker = value;
            RaisePropertyChanged(() => Worker);
        }
    }

    #endregion

    #region Construction

    public WorkerWindowViewModel()
    {
        CreateCommands();
    }

    #endregion

    #region Methods

    private void CreateCommands()
    {
        HireCommand = new RelayCommand(() => ExecuteHireCommand());

        AcceptCommand = new RelayCommand(() => ExecuteAcceptCommand());
        CancelCommand = new RelayCommand(() => ExecuteCancelCommand());
    }

    #endregion

    #region Commands

    public RelayCommand HireCommand { get; private set; }
    public RelayCommand AcceptCommand { get; private set; }
    public RelayCommand CancelCommand { get; private set; }

    private void ExecuteHireCommand()
    {
        Worker.IsEmployed = true;
        Worker.Employer = DataManager.Data.MasterGuildList[0];
    }
    private void ExecuteAcceptCommand()
    {
        Messenger.Default.Send<Worker>(Worker);

        Messenger.Default.Send<CloseWindowMessage>(new CloseWindowMessage(), WindowKey);
    }

    private void ExecuteCancelCommand()
    {
        Messenger.Default.Send<CloseWindowMessage>(new CloseWindowMessage(), WindowKey);
    }

    #endregion
}

それが役立つ場合は、子ウィンドウを作成する方法を次に示します。

Messenger.Default.Register<OpenWorkerWindowMessage>(this, message =>
        {
            var uniqueKey = System.Guid.NewGuid().ToString();
            var workerWindowVM = SimpleIoc.Default.GetInstance<WorkerWindowViewModel>(uniqueKey);
            workerWindowVM.Worker = message.Argument;
            workerWindowVM.WindowKey = uniqueKey;
            var workerWindow = new WorkerWindowView(uniqueKey)
            {
                DataContext = workerWindowVM,
                Owner = this
            };
            workerWindow.Closed += (sender, args) => SimpleIoc.Default.Unregister(uniqueKey);
            workerWindow.Show();
        });
4

1 に答える 1

0

選択したワーカーを編集するために開くウィンドウは、ワーカー データの独自のコピーを操作する必要があります。そのため、受諾がクリックされるまで/クリックされない限り、監視可能なコレクションの内容は変更されません。受諾アクションは、選択されたワーカーを更新します。 「ワーカーの編集」ウィンドウで操作された「一時的な」コピーからのコレクション。

于 2013-06-17T23:33:47.917 に答える