wpf datatrigger没有看到用户控件属性

时间:2014-01-31 02:27:11

标签: wpf data-binding user-controls inotifypropertychanged datatrigger

我尝试根据本地属性更改用户控件的样式。我已经尝试使用依赖属性并实现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中的border元素,它会看到触发器,但会显示IsShowing == True Value{x:Null}。但是,如果我在WPF检查器中查看用户控件的实例,则显示IsShowing = True

1 个答案:

答案 0 :(得分:1)

将评论升级到答案......

1)要将UserControl设置为自己的DataContext,只需在构造函数中执行this.DataContext=this;。除了开发/测试之外,你几乎从不想做任何事情,因为如果使用你的控件的人将DataContext设置为其他东西(即他们实际想要显示的数据),那么它将破坏你所有的绑定。 / p>

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}" ...