【问题标题】:How to retrieve data from a dialog box?如何从对话框中检索数据?
【发布时间】:2011-01-12 07:17:09
【问题描述】:

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

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

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

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?因为就目前而言,我认为我的变量正在被修改,因为它只是做一个浅拷贝。

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    我认为您确实在这里采用了正确的方法,但是您需要对 ObservableCollection 进行深层复制。为此,请确保您的“变量”类是可克隆的(尝试实现 ICloneable)

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

    【讨论】:

    • +1 这样你的答案就超出了我的范围。我显然很困惑:)
    • 啊! ICloneable!我试图考虑“我如何检查该类是否实现了复制构造函数以便我可以编写扩展......”这会很好地工作。
    【解决方案2】:

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

    【讨论】:

    • 其实在 WPF ShowDialog 中返回一个 Nullable
    • 当我写“在用户真正点击“保存”之前,它不会反映在主窗口中”,我的意思是这是 预期的 行为。我不需要也不希望它立即更新。不过感谢您的建议……也许将来会出现一些对话框。
    【解决方案3】:

    此扩展方法可能对某人有所帮助:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-12
      • 1970-01-01
      相关资源
      最近更新 更多