Как изменить значение модели, отправленной в другой класс, не затрагивая исходную модель ⇐ C#
-
Anonymous
Как изменить значение модели, отправленной в другой класс, не затрагивая исходную модель
публичный класс MyModel: INotifyPropertyChanged { частный MyEnum _myEnumValue; общедоступный MyEnum MyEnumValue { получить => _myEnumValue; набор { если (значение == _myEnumValue) return; _myEnumValue = значение; ПриИзмененииСвойства(); } } //При изменении свойств } общедоступный класс MainViewModel { частная MyModel _myModelVariable; общедоступная MyModel MyModelVariable { get=>_myModelVariable; set {_myModelVariable = значение; OnPropertyChanged();} } общественная MainViewModel() { MyModelVariable = новый(); MyModelVariable.MyEnumValue = MyEnum.Enum1; } общественная недействительность OptionsButton() { _windowManager.ShowDialogAsync(новый EditViewModel(MyModelVariable)); } } общедоступный класс EditViewModel: INotifyPropertyChanged { частная MyModel _localModel; общедоступный EditClass (MyModel myModel) { _localModel = мояМодель } общедоступная MyModel LocalModel { получить => _localModel; набор { _localModel = значение; ПриИзмененииСвойства(); } } публичная недействительность OkButton() { // отправка LocalModel в модель основного представления с помощью EventAggregator } публичная недействительность CancelButton() { Закрой окно(); } } Данный код смоделирован на основе исходного кода. В своем приложении WPF я использую Caliburn Micro и работаю с моделями представлений. На одном из моих экранов пользователь нажимает кнопку параметров, чтобы обновить значения. При нажатии кнопки открывается новое окно, и это окно управляется EditViewModel. Я создаю окно, используя «новое», и открываю его с помощью IWindowManager. Открывая его, я присылаю свою оригинальную модель. В EditViewModel я присваиваю исходную модель локальной переменной и выполняю над ней операции. Выбранное значение в поле со списком на передней панели привязано. Когда пользователь меняет ее, я также меняю локальную переменную. Если пользователь нажимает «ОК», я отправляю новые значения в MainViewModel с помощью EventAggregator. Если они нажмут «Отмена», я закрою окно, ничего не делая.
Проблема: когда пользователь меняет значение во внешнем интерфейсе EditViewModel, значение исходной модели в MainViewModel также меняется. Это вероятная ситуация, поскольку исходное значение рассматривается как ссылка, но я не хочу, чтобы это произошло. Я пробовал такие решения, как клонирование и копирование, но не смог решить эту проблему. Какие у вас предложения?
Проблема решена
Класс является ссылочным типом. Я добавляю частную переменную MyEnum _myEnum в EditViewModel. Я назначаю _localModel.MyEnumValue _myEnum в конструкторе, и проблема решена. По моему мнению, Enum — это тип значения, поэтому я конвертирую ссылочный тип MyModel в тип значения.
публичный класс MyModel: INotifyPropertyChanged { частный MyEnum _myEnumValue; общедоступный MyEnum MyEnumValue { получить => _myEnumValue; набор { если (значение == _myEnumValue) return; _myEnumValue = значение; ПриИзмененииСвойства(); } } //При изменении свойств } общедоступный класс MainViewModel { частная MyModel _myModelVariable; общедоступная MyModel MyModelVariable { get=>_myModelVariable; set {_myModelVariable = значение; OnPropertyChanged();} } общественная MainViewModel() { MyModelVariable = новый(); MyModelVariable.MyEnumValue = MyEnum.Enum1; } общественная недействительность OptionsButton() { _windowManager.ShowDialogAsync(новый EditViewModel(MyModelVariable)); } } общедоступный класс EditViewModel: INotifyPropertyChanged { частная MyModel _localModel; общедоступный EditClass (MyModel myModel) { _localModel = мояМодель } общедоступная MyModel LocalModel { получить => _localModel; набор { _localModel = значение; ПриИзмененииСвойства(); } } публичная недействительность OkButton() { // отправка LocalModel в модель основного представления с помощью EventAggregator } публичная недействительность CancelButton() { Закрой окно(); } } Данный код смоделирован на основе исходного кода. В своем приложении WPF я использую Caliburn Micro и работаю с моделями представлений. На одном из моих экранов пользователь нажимает кнопку параметров, чтобы обновить значения. При нажатии кнопки открывается новое окно, и это окно управляется EditViewModel. Я создаю окно, используя «новое», и открываю его с помощью IWindowManager. Открывая его, я присылаю свою оригинальную модель. В EditViewModel я присваиваю исходную модель локальной переменной и выполняю над ней операции. Выбранное значение в поле со списком на передней панели привязано. Когда пользователь меняет ее, я также меняю локальную переменную. Если пользователь нажимает «ОК», я отправляю новые значения в MainViewModel с помощью EventAggregator. Если они нажмут «Отмена», я закрою окно, ничего не делая.
Проблема: когда пользователь меняет значение во внешнем интерфейсе EditViewModel, значение исходной модели в MainViewModel также меняется. Это вероятная ситуация, поскольку исходное значение рассматривается как ссылка, но я не хочу, чтобы это произошло. Я пробовал такие решения, как клонирование и копирование, но не смог решить эту проблему. Какие у вас предложения?
Проблема решена
Класс является ссылочным типом. Я добавляю частную переменную MyEnum _myEnum в EditViewModel. Я назначаю _localModel.MyEnumValue _myEnum в конструкторе, и проблема решена. По моему мнению, Enum — это тип значения, поэтому я конвертирую ссылочный тип MyModel в тип значения.
Мобильная версия