向 WPF 元素添加新的自定义属性

问题描述 投票:0回答:1

就像 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,但没有运气。我错过了什么?

c#
1个回答
0
投票

我认为附加属性可以解决问题。 首先定义一个附加属性:

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);
© www.soinside.com 2019 - 2024. All rights reserved.