#c# #wpf
#c# #wpf
Вопрос:
Я хочу как сохранять новые записи, так и обновлять существующие записи, используя единую форму, но с двумя конструкторами (один с параметрами, а другой без). Вызываемый конструктор должен определять, какой метод следует вызвать (сохранить или обновить).
public ManageRecord(Record record ){ //update record }
public ManageRecord(){ //save new record }
private void Save_Click(object sender, RoutedEventArgs e){
//if default constructor invokes form call save method
SaveMethod();
//if constructor with parameters invokes form call update method
UpdateMethod(record);
}
Как мне этого добиться?
Комментарии:
1. Почему вы решили привлечь к этому конструкторы?
2. Я чувствую здесь проблему XY. Чего вы на самом деле пытаетесь достичь с помощью этого? Расскажите нам о вашей основной проблеме, и мы поможем вам исправить ее правильным образом.
3. Я собираюсь предположить , что это относится к модели представления. Вы пытаетесь узнать, следует ли вам вставить новую запись или обновить существующую на основе экземпляра модели, являющегося новым или нет. Если это правильно, пожалуйста, дайте нам знать.
4. @EdPlunkett я был бы рад, если бы вы могли подсказать мне лучший метод
5. @BradleyUffner я хочу выполнить обе задачи с помощью одной и той же формы / окна. и нет, это не в модели представления. Я новичок, и MVVM на данный момент у меня плохо работает
Ответ №1:
Что я делал в прошлом, чтобы решить эту проблему, так это иметь поле первичного ключа в модели в качестве Nullable
поля. Когда вы пытаетесь сохранить запись, вы можете просто посмотреть на поле в модели, если MyPk.HasValue
возвращает true
значение, то вы обновляете запись, если это так false
, вы вставляете новую запись.
Когда вы вызываете конструктор, который принимает экземпляр model, просто сохраните его в локальном поле. При вызове конструктора без модели создайте новый экземпляр модели с нулевым значением PK и сохраните его в локальном поле. Save
можно просто проверить локальное поле.
Итак, в конце концов, ваше действие напрямую не зависит от того, какой конструктор был вызван, оно должно основываться на состоянии модели, с которой вы в данный момент работаете.
Комментарии:
1. Примечание: возможно, вы захотите подчеркнуть тот факт, что в этом случае будет вызываться только один метод (например
SaveOrUpdate()
)2. я подумал о проверке идентификатора записи, которая передается конструктором, я только надеялся, что существует предварительно установленный
3. я думал о проверке идентификатора записи, которая передается конструктором, я только надеялся, что существует заранее установленный или лучший метод достижения того же результата
4. В него ничего не встроено. Вы всегда можете установить флаг, как в ответе, который дал @FrumRoll, но я чувствую, что гораздо лучший способ сделать это, полагаясь на свойства модели. Модель всегда должна быть там и быть согласованной. Если вы установили флаг из конструктора, вам нужно будет не забыть установить его, если вы когда-нибудь добавите другой конструктор. Это также может вызвать у вас проблемы, если вы когда-нибудь решите реализовать внедрение зависимостей.
Ответ №2:
Вы можете просто установить логическое значение в вашем конструкторе.
private readonly bool _isNewEntity;
public ManageRecord()
{
_isNewEntity = true;
// Same as existing, _record = new Record() ?
}
public ManageRecord(Record record)
{
_isNewEntity = false;
// Same as existing, _record = record ?
}
private void Save_Click(object sender, RoutedEventArgs e)
{
if (_isNewEntity)
SaveMethod();
else
UpdateMethod(record);
}