Как получить данные из диалогового окна? - PullRequest
1 голос
/ 12 января 2011

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

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

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

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? Потому что в нынешнем виде я думаю, что мои переменные изменяются, потому что он делает только мелкую копию.

Ответы [ 3 ]

2 голосов
/ 12 января 2011

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

foreach(var item in vars)
{
    Variables.Add((Variable)item.Clone());
}
1 голос
/ 12 января 2011

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

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

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

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

    public VariablesWindow(IEnumerable<TemplateVariable> vars)
    {
        Variables = new ObservableCollection<TemplateVariable>(vars.DeepCopy());
1 голос
/ 12 января 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...