我有一个DependencyObject(一个交互行为),我想从代码中得到它的x:Name(只是get,not set)。有可能吗?
编辑:在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属性没有被填充。
答案 0 :(得分:4)
如果您希望您的Name属性与x:Name XAML名称相同,那么不要实现您自己的dependcy属性,而是捎带已注册的现有属性。您只需将您的名称属性实现为:
public string Name
{
get { return (string) base.GetValue(FrameworkElement.NameProperty); }
set { base.SetValue(FrameworkElement.NameProperty, value); }
}
答案 1 :(得分:2)
如果从DependencyObject
派生的类未公开Name
属性,则无法确定分配的x:Name
。 x:Name
值仅存储在内部对象树中,并且没有API将值(对象)解析回键值(名称)。
但是,如果这是您自己的行为,那么只需在您的行为中添加Name
依赖项属性即可。 x:如果存在,名称将赋值为Name
属性。
如果这是现有行为,您可以从中继承该行为以创建具有Name
属性的新类。不幸的是,有些行为是密封的,所以你不能总是这样做。
答案 2 :(得分:2)
您可以创建'Name'AtachedProperty,并使用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);
}
}