【问题标题】:wpf datatrigger doesn't see user control propertywpf datatrigger 看不到用户控件属性
【发布时间】: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


【解决方案1】:

在此处将评论升级为答案...

1) 要将 UserControl 设置为它自己的 DataContext,只需在构造函数中执行 this.DataContext=this;。除了开发/测试之外,您几乎永远不会想要这样做,因为如果使用您的控件的人将 DataContext 设置为其他内容(即他们实际想要显示的数据),那么它将破坏您的所有绑定。

2) 它通常看起来像这样:

Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=your_namespace:ucLCGPulseWindowMini}, Path=IsShowing}" 

3) 如果您不想使用 FindAncestor,则为用户控件命名并直接引用它:

<UserControl
    x:Class="Your.NameSpace.ucLCGPulseWindowMini"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Name="myControl"
    d:DesignHeight="300" d:DesignWidth="300"
    >

   ... Binding="{Binding ElementName=myControl, Path=IsShowing}" ...

【讨论】:

  • 我正在使用 vb.net 并且没有明确设置命名空间。如何找到默认设置的内容?
  • 我尝试了您的 x:Name="myControl" 建议,效果也不错。
  • 是的,很抱歉,我是 C# 人。很高兴听到它的工作,欢迎使用 StackOverflow! :)
猜你喜欢
  • 2014-08-01
  • 1970-01-01
  • 2011-09-06
  • 1970-01-01
  • 2019-07-05
  • 2013-08-29
  • 1970-01-01
  • 2016-09-15
相关资源
最近更新 更多