2013-06-17 3 views
0

ObservableCollection<Worker>을 표시하는 DataGrid가 있습니다. 셀을 두 번 클릭하면 선택한 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(); 
     }); 

답변

0
선택한 근로자를 편집 창이 열리면이 관찰 모음의 내용까지 수정되지 않도록 클릭 동의하지 않는 한/작업자의 데이터를 자신의 사본에서 작동 할 필요가

- 수락 동작은 "편집 작업자"윈도우에서 조작 된 "임시"복사본에서 컬렉션의 선택된 작업자를 업데이트합니다.

+0

나는 그 줄에 뭔가있는 것으로 생각했다. 불행히도, 어떻게 해야할지 모르겠다. –

+0

MVVM이 아니기 때문에 더 이상 도움을 줄 수는 없지만 ObservableCollection의 목적은 변경 내용을 즉각적으로 알리는 것이므로 내용에 대해 무시할 수있는 업데이트를하고 싶지는 않습니다. – Zenilogix

+0

계속 찾아 볼 것입니다. 당신의 도움을 주셔서 감사합니다. –

관련 문제