を表示する 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();
});