2017-05-18 37 views
1

我正在使用一些带有模板内容的按钮c#/ WPF在资源字典数据触发器中使用c#变量

例如,

button.Template = (ControlTemplate)FindResource("StatusEmpty"); 

在隐藏文件相同的代码是一个名为currentNumber

private int currentNumber = 1; 
    public int CurrentNumber 
    { 
     get 
     { 
      return currentNumber; 
     } 
    } 

(全局)字段这些模板是在合并RessourceDictionary定义

<ControlTemplate x:Key="BinStatusEmpty" TargetType="Button"> 
    <Border x:Name="border" BorderBrush="LightGray" CornerRadius="8,8,8,8" Margin="3" > 
     <Border.Background> 
      <LinearGradientBrush> 
       <GradientStop Offset="0" Color="white"></GradientStop> 
       <GradientStop Offset="1" Color="LightGray"></GradientStop> 
      </LinearGradientBrush> 
     </Border.Background> 
     <ContentPresenter Content = "{TemplateBinding Content}" 
      HorizontalAlignment = "Center" VerticalAlignment = "Center" 
          TextBlock.FontSize="40"/> 
    </Border> 
    <ControlTemplate.Triggers> 
     <Trigger Property="IsMouseOver" Value="True"> 
      <Setter Property="BorderBrush" Value="Blue" TargetName="border" /> 
      <Setter Property="BorderThickness" Value="4" TargetName="border" /> 
     </Trigger> 

     <DataTrigger Binding="{Binding currentNumber, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}" Value="{TemplateBinding Content}" > 
      <Setter Property="BorderBrush" Value="Blue" TargetName="border" /> 
      <Setter Property="BorderThickness" Value="4" TargetName="border" /> 
     </DataTrigger> 

    </ControlTemplate.Triggers> 
</ControlTemplate> 

我要的是一个数据触发它根据当前的c#变量改变模板动态中定义的边界。

目前有两个问题: 1)结合

{Binding currentNumber, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}} 

没有找到我的变量

BindingExpression path error: 'currentNumber' property not found on 'object' ''MainWindow' (Name='xMainWindow')'. BindingExpression:Path=currentNumber; DataItem='MainWindow' (Name='xMainWindow'); target element is 'BinButton' (Name=''); target property is 'NoTarget' (type 'Object') 

2)我不能绑定

{TemplateBinding Content} 

为数据触发器的值。

非常感谢

回答

1

你应该绑定到财产Ç urrentNumber(大写 'C'),而不是支持字段Ç urrentNumber。

但是,您不能将DataTriggerValue属性绑定到某物。这是不支持:

Using binding for the Value property of DataTrigger condition

您需要使用转换器:

namespace WpfApplication1 
{ 
    public class MultiConverter : IMultiValueConverter 
    { 
     public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
     { 
      int CurrentNumber = (int)values[0]; 
      object content = values[1]; 

      return CurrentNumber.ToString() == content.ToString(); 
     } 

     public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 
     { 
      throw new NotSupportedException(); 
     } 
    } 
} 

XAML:

<ControlTemplate x:Key="BinStatusEmpty" TargetType="Button" 
       xmlns:local="clr-namespace:WpfApplication1"> 
    <ControlTemplate.Resources> 
     <local:MultiConverter x:Key="conv" /> 
    </ControlTemplate.Resources> 
    <Border x:Name="border" BorderBrush="LightGray" CornerRadius="8,8,8,8" Margin="3" > 
     <Border.Background> 
      <LinearGradientBrush> 
       <GradientStop Offset="0" Color="white"></GradientStop> 
       <GradientStop Offset="1" Color="LightGray"></GradientStop> 
      </LinearGradientBrush> 
     </Border.Background> 
     <ContentPresenter Content = "{TemplateBinding Content}" 
            HorizontalAlignment = "Center" VerticalAlignment = "Center" 
           TextBlock.FontSize="40"/> 
    </Border> 
    <ControlTemplate.Triggers> 
     <Trigger Property="IsMouseOver" Value="True"> 
      <Setter Property="BorderBrush" Value="Blue" TargetName="border" /> 
      <Setter Property="BorderThickness" Value="4" TargetName="border" /> 
     </Trigger> 
     <DataTrigger Value="True"> 
      <DataTrigger.Binding> 
       <MultiBinding Converter="{StaticResource conv}"> 
        <Binding Path="CurrentNumber" RelativeSource="{RelativeSource FindAncestor, AncestorType=Window}" /> 
        <Binding Path="Content" RelativeSource="{RelativeSource Self}" /> 
       </MultiBinding> 
      </DataTrigger.Binding> 
      <Setter Property="BorderBrush" Value="Blue" TargetName="border" /> 
      <Setter Property="BorderThickness" Value="4" TargetName="border" /> 
     </DataTrigger> 
    </ControlTemplate.Triggers> 
</ControlTemplate> 
+0

它的工作静态情况下,但我怎么能当CurrentNumber的值发生变化时触发器是否被触发?谢谢 – Rene

+0

@Rene:您需要实现INotifyPropertyChanged接口并在CurrentNumber属性设置为新值时引发PropertyChanged事件:https://msdn.microsoft.com/zh-cn/library/system.componentmodel.inotifypropertychanged (v = vs.110).aspx – mm8

+0

它的工作原理!非常感谢 – Rene