2011-01-12 62 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的深层副本。要做到这一点,请确保您的类“变量”是可克隆(试图实现ICloneable)

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

如果您希望主窗体在对话框打开时进行更新,我将使用事件在两个窗体之间进行通信。暴露主表单可以处理的对话框类中的事件(“ItemAdded”或其他)。当该事件被触发时,根据需要更新主窗体。

+1

实际上,在WPF ShowDialog中返回一个空值 2011-01-12 07:37:18

+0

当我写道“它不会反射回主窗口,直到用户实际点击”保存“为止。”我的意思是作为*意图*行为。我不需要也不希望它立即更新。感谢您的建议,虽然...也许对未来的一些对话框。 – mpen 2011-01-12 07:41:43

1

这种扩展方法可能帮助别人:

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());