wpf datatrigger看不到用户控件属性

标签 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 中查看边框元素,它会看到触发器,但显示 IsShowing == True Value{x:Null}。但是,如果我在 WPF 检查器中查看用户控件的实例,它会显示 IsShowing = True

最佳答案

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

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

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

关于wpf datatrigger看不到用户控件属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21471440/

相关文章:

c# - ComboBox SelectedValue 或 SelectedItem 绑定(bind) WPF C#

c# - 使用 WindowsXamlHost Overlay 托管 CaptureElement

asp.net - 在 DataGrid 控件内绑定(bind) DropDownList t 数据表列

c# - 自动滚动在子用户控件中不起作用

c# - 模型 View 演示器 : Why is model static?

c# - 如何获取内容控件中的元素

javascript - 如何在 agility.js 中绑定(bind)数据结构?

silverlight - 绑定(bind)到我的 WP7 Silverlight 应用程序中的样式

user-interface - 3 路输入的用户界面元素 : yes, 不,不关心

c# - Visual Studio 2010 设计器抛出实现虚拟方法