能否获取DependencyObject(Silverlight)的x:Name?

6

我有一个DependencyObject(即Interactivity行为),我想从代码中获取它的x:Name(只是获取,不是设置)。这个可能吗?

编辑:根据AnthonyWJones的答案:

我已经将以下代码插入到我的基本行为中:

[EditorBrowsable(EditorBrowsableState.Never)]
public string Name
{
    get { return (string)GetValue(NameProperty); }
    set { SetValue(NameProperty, value); }
}

public static readonly DependencyProperty NameProperty =
            DependencyProperty.Register("Name", typeof(string), typeof(BaseBehavior<T>), new PropertyMetadata(null));

我已经给我的行为设置了x:Name,但是Name属性没有被填充。

3个回答

4

如果您希望您的Name属性与x:Name XAML名称相同,那么不需要实现自己的依赖属性,可以利用已经注册的现有属性。您只需将您的名称属性实现为:

public string Name
{
    get { return (string) base.GetValue(FrameworkElement.NameProperty); }
    set { base.SetValue(FrameworkElement.NameProperty, value); }
}

2

您可以创建“Name”附加属性,并使用NameAttachedProperty.GetName(DependencyObject)

当然,在使用之前,您需要将其附加到元素上。

public static class NameAttachedProprty
{
    public static readonly DependencyProperty NameProperty =
        DependencyProperty.RegisterAttached("Name", typeof (string), typeof (NameAttachedProprty), new PropertyMetadata(default(string)));

    public static void SetName(DependencyObject element, string value)
    {
        element.SetValue(NameProperty, value);
    }

    public static string GetName(DependencyObject element)
    {
        return (string) element.GetValue(NameProperty);
    }
}

2
如果从DependencyObject派生的类没有公开Name属性,则无法确定分配的x:Namex:Name值仅存储在内部对象树中,没有API来将值(对象)解析回键值(名称)。
但是如果这是您自己的行为,则只需向行为添加Name依赖属性。 如果存在,则x:Name将其值分配给Name属性。
如果这是现有行为,则可以继承它以创建具有Name属性的新类。 不幸的是,某些行为被密封,因此您并不总是能够这样做。

@AnthonyWJones:那么,你有任何想法它为什么不起作用吗? - TDaver
@TDaver:这很奇怪,尝试使用Name而不是x:Name。 - AnthonyWJones
如果我在XAML中设置Name,它可以工作,但如果我设置x:Name,它就不行(我的意思是DependencyProperty NameProperty没有被设置)。 - TDaver

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接