【发布时间】:2014-01-31 02:27:10
【问题描述】:
我正在尝试根据本地属性更改用户控件的样式。我尝试使用依赖属性并实现 INotifyPropertyChanged 但没有任何效果。我是 WPF 的新手,所以我希望它很简单。感谢您的帮助。
位于用户控件 .xaml 文件的 ResourceDictionary 中的样式。 如果您删除数据触发器,效果会正确应用。
<Style x:Name="Showing" TargetType="Border">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=IsShowing}" Value="True">
<Setter Property="Effect">
<Setter.Value>
<DropShadowEffect ShadowDepth="0"
Color="Orange"
Opacity="1"
BlurRadius="1"
Direction="100"/>
</Setter.Value>
</Setter>
</DataTrigger>
</Style.Triggers>
</Style>
属性更改时会引发 PropertyChanged 事件。
Public Class ucLCGPulseWindowMini
Implements INotifyPropertyChanged
Public Event PropertyChanged(sender As Object, e As PropertyChangedEventArgs) Implements INotifyPropertyChanged.PropertyChanged
Public Shadows Sub OnPropertyChanged(sender As Object, e As PropertyChangedEventArgs)
If Not e Is Nothing Then
RaiseEvent PropertyChanged(Me, e)
End If
End Sub
Private blnShowing As Boolean = False
Public Property IsShowing() As Boolean
Get
Return blnShowing
End Get
Set(ByVal value As Boolean)
blnShowing = value
OnPropertyChanged(Me, New PropertyChangedEventArgs("IsShowing"))
End Set
End Property
在运行时将 IsShowing 属性设置为 True 后,我可以查看 WPF Inspector 中的边框元素,它会看到触发器,但会显示 IsShowing == True Value{x:Null}。但是,如果我在 WPF 检查器中查看用户控件的实例,它会显示 IsShowing = True
【问题讨论】:
-
您确定 IsShowing 正在执行正确的更改通知吗?
-
你可以在上面看到我对 INotifyPropertyChanged 的实现。这看起来正确吗?正如我所提到的,属性更改时会引发 PropertyChanged 事件。最后,注意到我默认 blnShowing 为 False。我本来希望 WPF 检查员反映的不是 X:Null。我猜这是一个绑定问题,但我对 WPF 太陌生了,这只是一个猜测。
-
对不起,我的错,没有注意到更改通知。它对我来说很好用,我唯一需要更改的是将 BlurRadius 设置为 10,因为 1 还不够。您正在指定一个键,因此您需要将样式显式应用于使用它的每个边框,您可以在您执行此操作的位置显示代码吗?
-
一秒,ucLCGPulseWindowMini是用户控件吗?您正在使用的绑定将在控件的 DataContext 中查找 IsShowing 属性,而不是控件本身。如果您希望它工作,您需要 1) 将 UserControl 设置为它自己的 DataContext,2) 更改绑定以执行 RelativeSource FindAncestor,或 3) 为您的用户控件命名并在绑定中的 ElementName 中指定该名称.如果您发布整个 UserControl XAML,我会为您提供您需要进行的确切更改。
-
是的,ucLCGPulseWindowMini 是一个用户控件。上面所有的代码都在用户控件的.xaml文件和后面的.vb代码中。
标签: wpf data-binding user-controls inotifypropertychanged datatrigger