我有一个TreeViewItem,我在其中使用TextBlock作为Header属性,使用自定义类作为Tag属性。如何创建TreeViewItem的副本?我已经尝试过序列化它,但它继续进入无限循环,创建一个Stack OverFlow Exception,当它试图序列化TreeViewItem时,但我找不到它。
这是我用作TreeViewItem
的Tag属性的自定义类 [Serializable]
[XmlRoot(ElementName="TVITagProperty")]
public class TVITagProperty {
#region Members
/// <summary>
/// Tree Type
/// </summary>
public enum TreeType {
User = 1,
Other = 2,
}
/// <summary>
/// Tag Property Type
/// </summary>
public enum TagType {
Entity = 1,
User = 2,
};
#endregion
#region C'tor
/// <summary>
/// Public parameterless constructor
/// </summary>
public TVITagProperty() { }
/// <summary>
/// Create a TreeViewItem Tag Property
/// </summary>
/// <param name="type">Type of Tag Property</param>
/// <param name="value">Value of Tag Property</param>
public TVITagProperty(TreeType treeType, TagType tagType, string value) {
ViewType = treeType;
PropertyType = tagType;
PropertyValue = value;
PropertyDirectory = false;
}
/// <summary>
/// Create a TreeViewItem Tag Property
/// </summary>
/// <param name="type">Type of Tag Property</param>
/// <param name="value">Value of Tag Property</param>
public TVITagProperty(TagType type, long? value) {
PropertyType = type;
PropertyValue = value.ToString();
}
#endregion
#region Methods
/// <summary>
/// Overloaded Equals method, compares one TVI Tag Property Property Type and Value
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public bool Equals(TVITagProperty obj) {
if(obj != null) {
if(obj.PropertyDirectory == true) {
if(this.ViewType == obj.ViewType &&
this.PropertyType == obj.PropertyType) {
return true;
}
}
else if(this.ViewType == obj.ViewType &&
this.PropertyType == obj.PropertyType &&
this.PropertyValue.Equals(obj.PropertyValue)) {
return true;
}
}
return false;
}
/// <summary>
/// Overrides ToString() and returns Property value
/// </summary>
/// <returns></returns>
public override string ToString() {
return this.PropertyValue;
}
/// <summary>
/// Returns the Property value as a long
/// </summary>
/// <returns></returns>
public long ToLong() {
return long.Parse(this.PropertyValue);
}
#endregion
#region Properties
/// <summary>
/// Represents the type of TreeView used in the View
/// </summary>
[XmlAttribute]
public TreeType ViewType { get; set; }
/// <summary>
/// The type of Property Tag
/// </summary>
[XmlAttribute]
public TagType PropertyType { get; set; }
/// <summary>
/// The value of Property Tag
/// </summary>
[XmlAttribute]
public string PropertyValue { get; set; }
/// <summary>
/// Defines whether the TVI is an object or directory
/// </summary>
[XmlAttribute]
public bool PropertyDirectory { get; set; }
#endregion
}
答案 0 :(得分:2)
创建一个wpf TreeViewItem的副本似乎是错误的方法 - 为什么要这样做?
更好的方法是不自行生成任何treeviewitems,但让wpf通过层次模板和itemsource处理它 - 然后你可以在itemssource中复制你的对象,wpf将为你渲染它们。
例如见:
答案 1 :(得分:0)
codeproject here
上有一个很好的深层克隆对象using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
/// <summary>
/// Provides a method for performing a deep copy of an object.
/// Binary Serialization is used to perform the copy.
/// </summary>
public static class ObjectCopier
{
/// <summary>
/// Perform a deep Copy of the object.
/// </summary>
/// <typeparam name="T">The type of object being copied.</typeparam>
/// <param name="source">The object instance to copy.</param>
/// <returns>The copied object.</returns>
public static T Clone<T>(T source)
{
if (!typeof(T).IsSerializable)
{
throw new ArgumentException("The type must be serializable.", "source");
}
// Don't serialize a null object, simply return the default for that object
if (Object.ReferenceEquals(source, null))
{
return default(T);
}
IFormatter formatter = new BinaryFormatter();
Stream stream = new MemoryStream();
using (stream)
{
formatter.Serialize(stream, source);
stream.Seek(0, SeekOrigin.Begin);
return (T)formatter.Deserialize(stream);
}
}
}
发布了更多参考和讨论here