数据触发器和绑定无法正常工作

时间:2016-09-19 13:40:40

标签: c# wpf xaml

我正试图第一次绑定我的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时,框中的文本为Black,当它返回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的视觉变化。这需要绑定,但我显然缺少/不理解一些关键的东西

1 个答案:

答案 0 :(得分:1)

您的问题是您尝试绑定到Method而不是属性。 尝试这样的事情:

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

编辑: 无法将参数传递到属性中,因此如果您无法访问文本框的值,则可能必须编写一个转换器以获取这些值。这里有基础知识:link 您可以传递一个对象作为值,另一个传递作为参数。 转换器然后处理信息并返回bool。 这里有一个关于这个转换器绑定的示例:

这是一个例子,你的绑定应该是这样的:

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

替换&#34; ElementName = boxVariable&#34;和&#34; ElementName = textboxDec&#34;使用您想要传递的控件的名称。您可能需要添加&#34; Path = Text&#34;在文本框绑定。

然后在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 */
    }
}