2010-01-04 98 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>