就像 Header 是 TreeViewItem 的属性一样,我正在尝试添加另一个可以在代码中引用的属性。
我开始研究 DependencyProperty,但我有一种感觉这是错误的方向,以及制作一个简单的扩展来尝试设置我正在寻找的属性。
我想要开始工作的小片段看起来有点像这样:
public bool AddNewTreeviewChild(ItemCollection selectedTreeView, TreeViewItem selectedItem)
{
if (selectedTreeView.Contains(selectedItem))
{
var newChild = new TreeViewItemExtension();
newChild.Header = NewItem.Text;
newChild.TreeViewType = DesignateChildType();
selectedItem.Items.Add(newChild);
}
foreach (TreeViewItem item in selectedTreeView)
{
if (AddNewTreeviewChild(item.Items, selectedItem))
{
return true;
}
}
return false;
}
我尝试过的依赖属性方式:
public static readonly DependencyProperty TreeViewTypeProp =
DependencyProperty.Register(
"TreeViewType",
typeof(string),
typeof(TreeViewItem),
new PropertyMetadata("Root")
);
public string TreeViewType
{
get { return (string)GetValue(TreeViewTypeProp); }
set { SetValue(TreeViewTypeProp, value); }
}
但是,这仍然会导致上面示例中的 TreeViewType 无法访问或无法使用,从而无法编译或运行。
我还尝试用一个简单的方法进行扩展:
public class TreeViewItemExtension : TreeViewItem
{
public string TreeViewType { get; set; }
public TreeViewItemExtension ()
{
}
}
但是当查看新添加的项目时,TreeViewType 丢失了。我尝试将各种 TreeViewItems 转换并重命名为 TreeViewItemExtension,但没有运气。我错过了什么?
我认为附加属性可以解决问题。 首先定义一个附加属性:
public class TreeViewType
{
public static readonly DependencyProperty TreeViewTypeProperty = DependencyProperty.RegisterAttached(
"TreeViewType",
typeof(string),
typeof(TreeViewItem),
new PropertyMetadata(null));
public static string GetTreeViewType(DependencyObject target) => (string)target.GetValue(TreeViewTypeProperty);
public static void SetTreeViewType(DependencyObject target, string value) => target.SetValue(TreeViewTypeProperty, value);
}
然后您可以在代码中为单个
TreeViewItems
设置TreeViewType:
TreeViewType.SetTreeViewType(item, "type1");
并获取 TreeViewType,如下所示:
string type = TreeViewType.GetTreeViewType(item);