C# 更改自定义属性不会触发绑定更新
我尝试创建一个名为C# 更改自定义属性不会触发绑定更新,c#,wpf,triggers,dependency-properties,C#,Wpf,Triggers,Dependency Properties,我尝试创建一个名为MyComboBox的自定义组合框。它有一个按钮,用于在上一项和下一项之间切换 我将底色存储在BaseBackground中。这很有用,因为我不希望FrontGlyph具有从模板化父级继承的Background 这是我的WPF代码: 这是MyComboBox的源代码: class MyComboBox:组合框 { 公共静态只读从属属性BaseBackgroundProperty; 公共SolidColorBrush BaseBackground{get{return(Sol
MyComboBox
的自定义组合框。它有一个按钮,用于在上一项和下一项之间切换
我将底色存储在BaseBackground
中。这很有用,因为我不希望FrontGlyph
具有从模板化父级继承的Background
这是我的WPF代码:
这是MyComboBox的源代码:
class MyComboBox:组合框
{
公共静态只读从属属性BaseBackgroundProperty;
公共SolidColorBrush BaseBackground{get{return(SolidColorBrush)GetValue(BaseBackgroundProperty);}set{SetValue(BaseBackgroundProperty,value);}
静态mycombox()
{
BaseBackgroundProperty=DependencyProperty.Register(“BaseBackground”、typeof(SolidColorBrush)、typeof(MyComboBox)、new FrameworkPropertyMetadata(Bruss.Lime、FrameworkPropertyMetadata Options.AffectsRender、OnBaseBackgroundPropertyChanged));
}
公共邮箱()
{
DefaultStyleKey=typeof(MyComboBox);
}
BaseBackgroundPropertyChanged上的私有静态无效(DependencyObject发送方,DependencyPropertyChangedEventArgs参数)
{
//当鼠标位于控件上方时,触发器尝试设置BaseBackground时,不会调用此函数
}
}
当我将鼠标悬停在控件上时,它应该会改变颜色。我应该能够通过更改BaseBackground
来实现这一点,因为FrontGlyph
和BaseComboBox
都将其背景颜色绑定到该框。尽管如此,代码还是可以编译,但没有发生更改。不仅在UI上,而且如果我调试代码,我也看不到C#中的变化
如果我更改FrontGlyph
的背景色,并将BaseComboBox.BackgroundColor
绑定到该背景色,则效果很好
有人能解释一下为什么我的自定义属性BaseBackground
的更改没有注册吗?它不能是标准的“实现<代码>INotifyPropertyChanged接口。”问题,因为我使用<代码>笔刷作为我的属性,并且笔刷在其他任何地方都能很好地工作。:)
我的实现可能看起来很愚蠢。嗯,我是WPF的新手。另外,我不想让整个实现给您带来负担,只是尝试复制关键部分
更新
我发现在我的源代码中,如果满足某些条件,我会设置BaseBackground=newsolidcolorbush(…)
。如果我删除这行代码,现在触发器工作,BaseBackground被指定为Goldenrod颜色
但我想知道,为什么从C代码更改DependencyProperty会阻止它从XAML标记工作。此外,我需要他们两个都工作
谢谢。总结 我认为您可能想做的是在名称
“BaseBackground”
(而不是“Background”
)下注册BaseBackgroundProperty
),因为您的xaml正在尝试使用该名称设置属性
详细信息
查看您的代码,我认为您的MyComboBox.BaseBackground
属性从未设置的原因是,它正在使用名称“Background”
向依赖属性系统注册。这意味着您有一个在基类中注册为“Background”
(Control.BackgroundProperty
)的属性,以及一个在派生类中注册为“Background”
(MyComboBox.BaseBackgroundProperty
)的属性。因此,从理论上讲,在xaml中设置“Background”
应该以设置MyComboBox.BaseBackgroundProperty
结束,而设置“Control.Background”
应该以设置Control.Background
属性结束
虽然这在理论上有效,但我不知道它在实践中是否有效。这也不是真正的做事方式。如果您想以某种方式修改类的现有属性,可以在类型初始值设定项(也称为静态构造函数)中重写
Control.BackgroundProperty
的元数据,但我认为这不是您的意图。您的xaml正在尝试设置名为“BaseBackground”
的不存在属性。根据您的问题更新,您所做的似乎是在dependency属性上设置本地值,这可能会破坏模板绑定。在通过其他方式设置目标的特定情况下,单向绑定可能会发生这种情况。在这种情况下,您似乎正在设置源代码,但它可能导致绑定中断
您可以通过将绑定的属性设置为“High”来调试绑定。(您可能需要使用标准的{Binding RelativeSource={RelativeSource TemplatedParent},