2012-03-01 76 views
1

我在ResourceDictionary中将按钮样式设置为DataTemplate。这里有一小部分:DataTemplate检查绑定是否存在

<Style TargetType="{x:Type Button}"> 
    <Setter Property="Focusable" Value="False"></Setter> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type Button}"> 
       <Border x:Name="border"> 
        ... 
       </Border> 
       <ControlTemplate.Triggers> 
        <DataTrigger Binding="{Binding IsSelected}" Value="True"> 
         <Setter Property="Background" TargetName="border" Value="Red" /> 
        </DataTrigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

在这个模板中有一个与属性IsSelected的绑定。这种特性在那里是一种情况,在其他情况下则不是。

如果绑定路径存在,是否可以检查Xaml,然后在其他情况下使用它忘记它? 现在我在调试输出BindingExpression,我想消除这一点。

回答

1

更相关的问题是:为什么你的ControlTemplate中有DataTrigger?这会在控件与其数据上下文之间创建依赖关系,这就是为什么当数据上下文与控件模板的期望不匹配时,您会遇到此问题。

你确定你不能使用更合适的机制吗?例如,你可以改为使用IsSelected应该影响Background的那些按钮的样式吗?

<Style x:Key="SpecialButtonStyle" TargetType="Button"> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding IsSelected}" Value="True"> 
      <Setter Property="Background" Value="Red" /> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

... 

<Button DataContext="relevant data context" Style="{StaticResource SpecialButtonStyle}"/> 

,或者甚至更好,你能定义你必须具有IsSelected财产的具体数据类数据模板?该数据模板可以自动使用正确的Button风格。

+0

我如何访问TargetName边框?哪一种是另一种风格?这可能吗? – San 2012-03-01 12:02:24

+1

你没有。相反,您需要更新您的控件模板绑定到的控件的属性。这使得数据和数据的可视化之间保持清晰的分离。在这种情况下,你可能会让你的样式触发器设置'Button'的'Background'属性。然后按钮的控件模板中的'border'元素将使用'TemplateBinding'到按钮的'Background'属性。 – 2012-03-01 15:49:10