2011-01-12 3 views
1

Просто попытайтесь найти простой способ передать или поделиться некоторыми данными между главным окном и диалоговым окном.Как получить данные из диалогового окна?

В моем главном окне есть набор переменных, которые я хочу передать в диалоговое окно, чтобы их можно было отредактировать.

Как я сделал это сейчас, я прохожу в списке конструктору диалогового окна:

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    var window = new VariablesWindow(_templateVariables); 
    window.Owner = this; 
    window.ShowDialog(); 
    if(window.DialogResult == true) 
     _templateVariables = new List<Variable>(window.Variables); 
} 

А потом там, я думаю, мне нужно глубоко скопировать список,

public partial class VariablesWindow : Window 
{ 
    public ObservableCollection<Variable> Variables { get; set; } 

    public VariablesWindow(IEnumerable<Variable> vars) 
    { 
     Variables = new ObservableCollection<Variable>(vars); 
     // ... 

Так что, когда они редактируются, они не отражаются обратно в главном окне, пока пользователь не наведет «Сохранить».

Это правильный подход? Если да, есть ли простой способ для глубокого копирования ObservableCollection? Потому что, поскольку он стоит сейчас, я думаю, что мои переменные изменяются, потому что они делают только мелкую копию.

ответ

2

Я думаю, что вы действительно следуете правильному подходу здесь, но вам нужно сделать глубокую копию вашего ObservableCollection. Чтобы сделать это, убедитесь, что ваш класс «Variable» является Клонируемый (попробуйте реализовать ICloneable)

foreach(var item in vars) 
{ 
    Variables.Add((Variable)item.Clone()); 
} 
+0

+1 так, чтобы ваш ответ прошел выше моего. Я, по-видимому, смутился :) –

+0

А! 'ICloneable'! Я пытался подумать о том, «как проверить, реализует ли класс конструктор-копию, чтобы я мог написать расширение ...» Это будет хорошо работать. – mpen

1

Я бы использовал события для связи между двумя формами, если вы хотите, чтобы основная форма обновлялась, когда диалог открыт. Выделите событие («ItemAdded» или что-то еще) из вашего класса диалога, который может обрабатывать основная форма. Когда это событие запущено, обновите основную форму по мере необходимости.

+1

На самом деле, в WPF ShowDialog возвращает значение Nullable

+0

Когда я писал: «Это не отражается обратно в главном окне, пока пользователь не наведет« Сохранить ». Я имел в виду, что как * предполагаемое * поведение. Мне не нужно и не нужно немедленно обновлять его. Спасибо за предложение, хотя ... возможно, для будущего диалогового окна. – mpen

+0

@ Rewinder: О, я исправлю это, спасибо. –

1

Этот метод расширения может помочь кому-то:

public static IEnumerable<T> DeepCopy<T>(this IEnumerable<T> collection) where T : ICloneable 
{ 
    return collection.Select(x => (T) x.Clone()); 
} 

Это несколько упрощает мое диалоговое окно:

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