2012-06-24 3 views
0

Я просто знаком с привязкой данных 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? Если это единственный способ, как это сделать, легко используя мои первые модели кода?

ответ

0

Вопрос 1: Привязывается ко второму/временному объекту. Если пользователь отменяет, выбросьте его. Если они этого не делают, используйте его для обновления исходного объекта. Связывание данных действительно не предлагает метод «отмены» или «сброса».

Вопрос 2: Нет, использование ObservableCollection не усложняет ситуацию. Это рекомендуемый способ делать вещи. На самом деле гораздо труднее работать без им.

+0

Спасибо, что касается Вопроса 1, это именно то, что я делаю сейчас с привязкой OneWay, так что это хорошо. На вопрос 2 есть ли пример, на который вы можете указать мне? Как я могу обернуть мои DBS-файлы с помощью IObservable, не становясь слишком сложными? –

+0

Это не то, что вы хотите сделать. «ObservableCollection » будет управлять обновлением коллекции (add/remove), но не свойствами каждого отдельного объекта. Чтобы обрабатывать обновление отдельного элемента, вы захотите создать ViewModel для этого объекта, который реализует 'INotifyProperyChanged'. Если вы это сделаете, вы можете сделать «ObservableCollection ». – Tyrsius

+0

Хммм. Я не уверен, что это правильно, но я реализовал INotifyPropertyChanged в моих первых классах кода. Затем я объявил все мои коллекции как IObservable (общедоступный виртуальный ObservableCollection Патчи {get; set;}) в моих первых классах кода.Конечно, я называю свой OnPropertyChanged для всех свойств. На самом деле это отлично работает сейчас в моем списке Banks. Тем не менее, мой список патчей по-прежнему не обновляется, хотя Bank.Patches - это коллекция Observable. Комментарии или мысли? –

Смежные вопросы