假设我有控制权
A
,并且附加了属性AP
。控件 B
将其用作 A.AP="value"
。
附加属性更改事件签名与依赖属性相同,只是
d
现在是附加的元素,即 B
。如何在已更改的事件中访问 A
?
我想隐藏
A
如果 AP == null
以及更多
private static void OnApChanged
(DependencyObject d, DependencyPropertyChangedEventArgs e)
编辑:请注意,我知道“通常”附加属性的用途是在附加控件上设置某些内容,即
A
通常会操纵 B
属性以实现某些目的。但这只是一种情况。我正在研究不同的场景,当 B
不知道 A
的存在时 - A
被埋在视觉树中的某个地方(或者甚至可能根本不存在),而我需要的是 B
实际设置 AP
到字符串,A
应该能够对更改做出反应并使用该值。它听起来确实很像依赖属性(附加属性非常相似),但只是没有 B
意识到 A
EDIT2:此时我想做的是 - 我想要一个用户控件 HelpButton (
HB
),它上面有一个按钮和 TopicName 属性。我希望任何FrameworkElement
的孩子都能拥有它。父母不知道这一点,并且HB
也不知道父母。当设置 TopicName 时,HB 可见。如果您单击它,它将仅使用主题名称打开帮助窗口,不需要其他信息。
我先总结一下我对问题的理解。您有一个帮助按钮
HB
并且它有一个 TopicName
属性。当 TopicName
为空时,HB
应该隐藏,否则单击时应该打开一个基于 TopicName
的窗口(我假设 HelpButton
正在内部处理所有这些逻辑)。然而,任何其他元素都可以设置 HB
的 TopicName
,而无需实际需要引用 HB
本身的实例。
您正在寻找的内容似乎不太适合附加属性,因为附加属性仍然需要目标对象的实例,而没有涉及所属类型的实例。如果我们将
HelpButton
设置为拥有类型,则这不起作用,因为 HelpButton
是我们需要更改其属性的类型。如果我们将其他东西设为拥有类型,这也不起作用,因为没有其他人可以根据您的问题访问 HelpButton
的实例。所以我认为附加属性在这里是错误的。
但是,我认为两个元素都可以访问/绑定的单例视图模型适合您。这是一个粗略的例子:
查看模型
public static class ViewModels
{
public static HelpViewModel HelpViewModel
{
get;
} = new HelpViewModel();
}
public class HelpViewModel : ViewModel
{
#region string HelpTopic property
private string _HelpTopic;
public string HelpTopic
{
get
{
return _HelpTopic;
}
set
{
if (_HelpTopic == value)
return;
_HelpTopic = value;
OnPropertyChanged();
}
}
#endregion
}
XAML:
<HelpButton x:Name="HB" TopicName="{Binding
Source={x:Static local:ViewModels.HelpViewModel},
Path=HelpTopic}" />
这样任何人都可以从任何地方更改
ViewModels.HelpViewModel.HelpTopic
,而无需访问 HelpButton
实例。