1

我試圖根據本地屬性更改用戶控件的樣式。我試過使用依賴屬性和實現INotifyPropertyChanged,但沒有任何工作。我是新來的WPF,所以我希望這是簡單的。謝謝你的幫助。wpf datatrigger未看到用戶控件屬性

樣式位於用戶控件.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督察邊框元素,它看到了扳機,但說IsShowing == True Value{x:Null}。不過,如果我看在WPF檢查用戶控件的實例就說明這裏的答案IsShowing =真

+0

你確定IsShowing正在做適當的更改通知嗎? –

+0

你可以看到我上面的INotifyPropertyChanged的實現。這看起來正確嗎?正如我所提到的,PropertyChanged事件在屬性更改時引發。最後,我注意到我默認爲虛假。我會希望WPF檢查員反映,不是X:空。我猜這是一個有約束力的問題,但我對WPF這麼新,這只是一個猜測。 – ScottW

+0

對不起,我的壞,沒有注意到更改通知。它對我來說很好,我唯一需要改變的就是將BlurRadius設置爲10,因爲1不夠。您正在指定一個密鑰,因此您需要將該樣式顯式應用於每個使用它的邊框,您是否可以將代碼顯示在哪裏? –

回答

1

升級評論...

1)要設置用戶控件作爲自己的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! :) –