2016-09-19 65 views
-2

我想第一次与我的C#代码确定什么颜色xaml将使文本在自定义文本框中的绑定。数据触发器和绑定不起作用

我的C#代码:

public class Limits 
{ 
public static bool fruitLimits(string textboxDec, ComboBox boxVariable) 
{ 
    if (string.IsNullorWhiteSpace(textboxDec) 
    {return false;} 
    else if (boxVariable.SelectedIndex == 1) 
    { 
     try 
     { int apples = Convert.ToInt32(textboxDex); 
      if (apples < 4 && apples != 0) 
      {return false;} 
      else if(apples > 50) 
      {return false;} 
      else 
      return true; 
     } 
     catch (FormatException fEx) 
     {return false;} 
     } 
     else 
     { 
      try 
      { int oranges = Convert.ToInt32(textboxDec); 
      if (oranges < 1 && oranges != 0) 
      { 
      return false;} 
      else if (oranges > 100) 
      {return false;} 
      else 
      return true; 
      } 
      catch (FormatException fEx2) 
      {return false;} 
     } 
    } 

所以现在我想结合这个方法为XAML所以当此方法返回true,框中的文字是黑色的,当它返回false,该文本是红色的。

<local:DigitBox x:Name="FruitNumber"> 
    <local:DigitBox.Style> 
    <Style TargetType="local:DigitBox"> 
    <Style.Triggers> 
    <DataTrigger 
    Binding="{Binding Limits.fruitLimits}" Value="False"> 
    <Setter Property="Foreground" Value="Red"/> 
    </DataTrigger> 
    </Style.Triggers> 
    </Style> 
    </local:DigitBox.Style> 
    </local:DigitBox> 

所以没有发现错误,但我的自定义文本框不会改变颜色。我尝试直接在我的c#方法中设置颜色更改,并且工作。但我正在努力遵守我一直在阅读的内容,这些内容是保持xaml中的视觉变化。这需要约束力,但我显然缺少/不理解关键的东西

+0

有时是很有帮助的读一本书或有关技术要领* *前尝试使用它的文章。对于WPF数据绑定,我建议阅读MSDN上的[数据绑定概述](https://msdn.microsoft.com/en-us/library/ms752347(v = vs.110).aspx)文章理解。 – Clemens

回答

1

你的问题是,你正试图绑定到一个方法,而不是一个属性。 尝试是这样的:

public static bool fruitLimits 
{ 
    get 
    { /*your method code here*/ } 
} 

编辑: 有没有办法将参数传递到属性,所以如果你没有访问到文本框中的值,您可能需要写一个转换器,通过这些值。这里的基本知识:link 您可以传递一个对象作为值,另一个作为参数传递。 转换器然后处理信息并返回一个布尔值。 这里的绑定该转换器的应该是什么样子的例子:

这里一个例子,你的结合应该是这个样子:

   <DataTrigger Value="True"> 
        <DataTrigger.Binding> 
         <MultiBinding Converter="{StaticResource converterKey}"> 
          <Binding ElementName="boxVariable" /> 
          <Binding ElementName="textboxDec" Path="Text" /> 
         </MultiBinding> 
        </DataTrigger.Binding> 

替换“的ElementName = boxVariable”和“的ElementName = textboxDec “用你想要传递的控件名称。您可能需要在文本框绑定上添加“Path = Text”。

然后在IMultiValueConverter做这样的事情:

public object Convert(object[] value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
{ 
    if (value[0].GetType().Equals(typeof(ComboBox)) && value[1].GetType().Equals(typeof(String))) 
    { 
     ComboBox boxVariable = value[0] as ComboBox; 
     string textboxDec = value[1] as String; 

     /* your method code here, returns Boolean */ 
    } 
} 
+0

谢谢我现在就试试 – JohnChris

+0

你能举一个转换器的例子吗? - 它会使用我的方法fruitLimits的结果吗?然后它将如何传递给属性 – JohnChris

+0

嗨R.jauch感谢您的继续帮助,对于DataTrigger来说,'绑定'不能在'Binding'类型的'ConverterParameter'属性上设置。 “绑定”只能在DependencyObject的DependecyProperty上设置 – JohnChris