如何克隆WPF对象?

时间:2020-03-05 18:44:27  来源:igfitidea点击:

任何人都有一个很好的示例,该示例如何深度克隆WPF对象并保留数据绑定?

标记的答案是第一部分。

第二部分是我们必须创建一个ExpressionConverter并将其注入序列化过程。详细信息在这里:
http://www.codeproject.com/KB/WPF/xamlwriterandbinding.aspx?fid=1428301&df=90&mpp=25&noise=3&sort=Position&view=Quick&select=2801571

解决方案

回答

怎么样:

public static T DeepClone<T>(T from)
    {
        using (MemoryStream s = new MemoryStream())
        {
            BinaryFormatter f = new BinaryFormatter();
            f.Serialize(s, from);
            s.Position = 0;
            object clone = f.Deserialize(s);

            return (T)clone;
        }
    }

当然,这会深深克隆任何对象,并且它可能不是镇上最快的解决方案,但是维护最少。

回答

我做过的最简单的方法是使用XamlWriter将WPF对象保存为字符串。 Save方法将序列化对象及其逻辑树中的所有子对象。现在,我们可以创建一个新对象,并使用XamlReader加载它。

前任:
将对象写入xaml(假设该对象是Grid控件):

string gridXaml = XamlWriter.Save(myGrid);

将其加载到新对象中:

StringReader stringReader = new StringReader(gridXaml);
XmlReader xmlReader = XmlReader.Create(stringReader);
Grid newGrid = (Grid)XamlReader.Load(xmlReader);