Header プロパティに TextBlock を使用し、Tag プロパティとしてカスタム クラスを使用している TreeViewItem があります。TreeViewItem のコピーを作成するにはどうすればよいですか? シリアル化を試みましたが、無限ループに陥り続け、TreeViewItem をシリアル化しようとすると Stack OverFlow Exception が作成されますが、場所がわかりません。
これは、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
}