WPF 在附加属性更改事件中访问 self

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

假设我有控制权

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 可见。如果您单击它,它将仅使用主题名称打开帮助窗口,不需要其他信息。

c# wpf .net-8.0 attached-properties
1个回答
0
投票

我先总结一下我对问题的理解。您有一个帮助按钮

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
实例。

© www.soinside.com 2019 - 2024. All rights reserved.