Я просто знаком с привязкой данных WPF. Я вычислил большинство основ, но мне трудно разобраться в нескольких вещах.WPF DataBinding с кодом First Entity Framework
Во-первых, допустим, у меня есть объект под названием Synth, в котором есть коллекция банков. В свою очередь, у Банка есть коллекция патчей. У меня есть окно synth, к которому я устанавливаю DataContext для одного объекта Synth. У меня есть один список (lstBanks), который показывает все банки ({Binding Banks}) и еще один (lstPatches), который показывает все патчи ({Binding ElementName = lstBanks, Path = SelectedItem.Patches}). Все это прекрасно работает. Когда я выбираю банк, я вижу соответствующие патчи.
Вопрос 1: Как загрузить выбранный патч в диалоговое окно с двусторонней привязкой, но отменить эти изменения, если DialogResult = false?
Прямо сейчас у меня есть патч-диалог, который получает патч в конструкторе, который он устанавливает как свой DataContext, но я использую привязку OneWay только. Это происходит при двойном щелчке lstPatches.
private void Patch_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
Models.Patch patch = (Models.Patch)((ListBoxItem)sender).DataContext;
PatchEdit p = new PatchEdit(patch);
p.Owner = this;
if (p.ShowDialog().GetValueOrDefault())
{
// Do stuff if applicable
}
}
Вот мой PatchEdit конструктор и OK событие кнопки:
public PatchEdit(Models.Patch Patch) : this()
{
this.DataContext = Patch;
}
private void btnOK_Click(object sender, RoutedEventArgs e)
{
Models.Patch p = (Models.Patch)DataContext;
p.Name = txtName.Text;
p.MidiProgramChangeValue = int.Parse(txtPCN.Text);
this.DialogResult = true;
this.Close();
}
Если пользователь нажимает кнопку OK в диалоговом окне патча, что, когда я установить свойство из формы обратно к DataContext. Я не был уверен, что это лучший способ сделать это. Я не хочу действительно сохранять изменения, пока пользователь не нажмет OK в главном окне синтезатора. Таким образом, все изменения в банке и исправлениях должны оставаться только локальными и выполняться только «локально», если пользователь нажимает «ОК», а не «Отмена» в диалоговом окне.
Вопрос 2: После обновления патча через диалог, как я могу получить это изменение, отраженное в lstPatches?
Я понимаю, что непосредственное перемещение моих моделей, которые необходимы для типа DBSet, не наблюдаются. Я видел сообщения об использовании коллекции Observable, но разве это не просто усложняет то, что должно быть легко с привязкой данных WPF? Если это единственный способ, как это сделать, легко используя мои первые модели кода?
Спасибо, что касается Вопроса 1, это именно то, что я делаю сейчас с привязкой OneWay, так что это хорошо. На вопрос 2 есть ли пример, на который вы можете указать мне? Как я могу обернуть мои DBS-файлы с помощью IObservable, не становясь слишком сложными? –
Это не то, что вы хотите сделать. «ObservableCollection» будет управлять обновлением коллекции (add/remove), но не свойствами каждого отдельного объекта. Чтобы обрабатывать обновление отдельного элемента, вы захотите создать ViewModel для этого объекта, который реализует 'INotifyProperyChanged'. Если вы это сделаете, вы можете сделать «ObservableCollection ». –
Tyrsius
Хммм. Я не уверен, что это правильно, но я реализовал INotifyPropertyChanged в моих первых классах кода. Затем я объявил все мои коллекции как IObservable (общедоступный виртуальный ObservableCollection Патчи {get; set;}) в моих первых классах кода.Конечно, я называю свой OnPropertyChanged для всех свойств. На самом деле это отлично работает сейчас в моем списке Banks. Тем не менее, мой список патчей по-прежнему не обновляется, хотя Bank.Patches - это коллекция Observable. Комментарии или мысли? –