1

Я пытаюсь изменить стиль пользовательского элемента управления на основе локального свойства. Я попытался использовать свойства зависимостей и реализовать INotifyPropertyChanged, но ничего не работает. Я новичок в WPF, поэтому я надеюсь, что это что-то простое. Спасибо за вашу помощь.wpf datatrigger не видит свойства управления пользователем

Стиль, расположенный в ResourceDictionary пользовательского элемента управления .xaml. Если вы удалите данные, эффект будет применен правильно.

<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 Истина во время выполнения, я могу смотреть на границе элемента в WPF инспектора и он видит на спусковой крючок, но говорит IsShowing == True Value{x:Null}. Однако, если посмотреть на экземпляр пользовательского элемента управления в WPF инспектора он показывает IsShowing = True

+0

Вы уверены, что IsShowing делает правильное уведомление об изменении? –

+0

Вы можете увидеть мою реализацию INotifyPropertyChanged выше. Правильно ли это выглядит? Как я уже упоминал, событие PropertyChanged возникает при изменении свойства. Наконец, заметил, что я дефолтовал blnShowing на False. Я бы ожидал, что инспектор WPF будет считать это не X: Null. Я предполагаю, что это связанная проблема, но я так новичок в WPF, это просто догадка. – ScottW

+0

Извините, мой плохой, не заметил уведомления об изменении. Он отлично работает для меня, единственное, что мне пришлось изменить, - установить BlurRadius на 10, потому что 1 не хватило. Вы указываете ключ, поэтому вам нужно явно применять стиль к каждой границе, которая его использует, можете ли вы показать код, где вы это делаете? –

ответ

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

Я использую vb.net и явно не устанавливаю NameSpace. Как определить, по умолчанию ли он установлен? – ScottW

+1

Я попробовал ваше предложение x: Name = "myControl" и работало так же хорошо. – ScottW

+0

Да, извините, я парень C#. Рад слышать, что он работает, добро пожаловать в StackOverflow! :) –

Смежные вопросы