如何从对话框中检索数据?

时间:2011-01-12 07:17:10

标签: c# wpf

试图找出一种在主窗口和对话框之间传递或共享某些数据的简单方法。

我在主窗口中有一组变量,我想传递给一个对话框,以便对它们进行编辑。

我现在的方式是,我将列表传递给对话框的构造函数:

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 个答案:

答案 0 :(得分:2)

我认为你确实在这里采用了正确的方法,但你需要制作一份ObservableCollection的深层副本。为此,请确保您的“变量”类是Clonable(尝试实现ICloneable)

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

答案 1 :(得分:1)

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

答案 2 :(得分: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());