2010-01-04 73 views
4

我有一個自定義的依賴屬性,我想用它作爲數據觸發器。這裏是後面的代碼:在WPF中使用自定義依賴屬性作爲DataTrigger

public static readonly DependencyProperty BioinsulatorScannedProperty = 
    DependencyProperty.Register(
     "BioinsulatorScanned", 
     typeof(bool), 
     typeof(DisposablesDisplay), 
     new FrameworkPropertyMetadata(false)); 

    public bool BioinsulatorScanned 
    { 
     get 
     { 
      return (bool)GetValue(BioinsulatorScannedProperty); 
     } 
     set 
     { 
      SetValue(BioinsulatorScannedProperty, value); 
     } 
    } 

我已經創建了一個樣式和控件模板。我的目標是改變一些文字的顏色,當依賴道具設置爲true ...

<Style x:Key="TreatEye" TargetType="Label"> 
     <Setter Property="Foreground" Value="#d1d1d1" /> 
     <Setter Property="FontWeight" Value="Bold" /> 
     <Setter Property="FontSize" Value="30" /> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="Label"> 
        <Canvas>        
         <TextBlock x:Name="bioinsulatorText" 
            Canvas.Left="21" Canvas.Top="33" 
            Text="Bioinsulator" /> 
         <TextBlock Canvas.Left="21" Canvas.Top="70" 
            Text="KXL Kit" /> 
        </Canvas> 

        <ControlTemplate.Triggers> 
         <DataTrigger Binding="{Binding BioinsulatorScanned}" 
            Value="True"> 
          <Setter TargetName="bioinsulatorText" 
            Property="Foreground" Value="Black" /> 
         </DataTrigger> 
        </ControlTemplate.Triggers> 

       </ControlTemplate> 
      </Setter.Value> 
     </Setter>    
    </Style> 

儘管依賴道具編程成功設置爲true,這觸發條件永遠不會觸發。這是一個真正的調試痛苦!

在此先感謝。

+0

您定義了哪個對象的依賴屬性? – 2010-01-04 21:02:24

+0

我不知道我是否完全理解,但我試圖使用ControlTemplate.Triggers部分中的依賴項屬性。當這是真的,我需要在「bioinsulatorText」內的文字變黑。 – BabaBooey 2010-01-04 21:29:25

回答

2

看起來您的依賴項屬性是在您創建的DisposableDisplay對象內定義的。爲了使指定的綁定起作用,必須將該對象的一個​​實例設置爲控件(本例中爲標籤)的DataContext或其任何祖先的DataContext

+0

這完美的作品。作爲WPF新手,我發現數據綁定是最麻煩的話題之一。在哪些情況下DataContext不需要設置? – BabaBooey 2010-01-04 21:56:37

+0

當您使用數據模板時,'DataContext'被默認設置。在項目控件(列表框,列表視圖,數據網格等)中默認使用數據模板。另外,您可以在任何元素上顯式設置datacontext以更好地促進綁定。這是WPF中最重要的概念之一。 – 2010-01-04 22:02:44

3

在這種情況下,我使用基於依賴屬性FirstLevelProperty的數據觸發器切換按鈕的可見性。

public static readonly DependencyProperty FirstLevelProperty = DependencyProperty.Register("FirstLevel", typeof(string), typeof(MyWindowClass)); 

public string FirstLevel 
     { 
      get 
      { 
       return this.GetValue(FirstLevelProperty).ToString(); 
      } 

      set 
      { 
       this.SetValue(FirstLevelProperty, value); 
      } 
     } 

可以通過使用RelativeSource引用結合在一個窗口中包含的依賴屬性FirstLevel(Property)(在這種情況下)。你也應該在樣式中設置默認設置,這將被datatrigger覆蓋。

<Button.Style> 
    <Style TargetType="Button"> 
     <Style.Triggers> 
      <DataTrigger 
      Binding="{Binding Path=FirstLevel, 
      RelativeSource={RelativeSource FindAncestor, 
      AncestorType={x:Type Window}}}" 
      Value="SomeValue"> 
       <Setter Property="Visibility" 
       Value="Hidden" /> 
      </DataTrigger> 
     </Style.Triggers> 
     <Setter Property="Visibility" Value="Visible" /> 
    </Style> 
</Button.Style>