源绑定的一种方法不起作用

时间:2016-11-21 08:55:08

标签: c# wpf data-binding

好的快速摘要是,我正在尝试进行onewaytosource绑定。

解释我对代码的理解。 OneWaytoSource与One Way绑定相反。目标更新源。所以这里我的目标是我创建绑定(所以我的文本框)我的目标属性是前景。我的源代码是我的menuItem,我的source属性是" IsEnabled"。

值转换器在ConvertBack中编程,因为这是用于Onewaytosource或双向绑定的部分。

其中一个文本框:(我计划在大约40个文本框上使用这个类似的代码,如果前景为红色,将禁用我的menuItem)

 <TextBox x:Name="upperLimitMinimum" Foreground="{Binding ElementName=menuItem, Path=IsEnabled, Mode=OneWayToSource, Converter={StaticResource myColorErrorConverter}}"

这是我的转换器代码:

public class myColorErrorConverter : IValueConverter
 {
     public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
     {

        return null;
     }

     public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
     {
        if (null != value)
        {
            string x = value.ToString();
            if (x == "Red")
            { return true; }

        }
        return false;
    }
 }

我的menuItem,

 <MenuItem x:Name="menuItem"   Header="Menu Item( Ctrl + E )" Command="{Binding MenuItem}" 

我期待发生什么?当文本框前景变为红色时(由验证检查控制,使用多值转换器 - 未显示)menuItem应该被禁用。我在转换器上设置了一个断点,代码甚至没有进入转换器,所以不确定发生了什么?有人可以对此有所了解吗?

克莱门斯回应后,新代码:

    <Style>
 <Style.Triggers>
   <DataTrigger Value="True">
     <DataTrigger.Binding>
       <MultiBinding  Converter="{StaticResource MultiValueConverterColour}" >
     <Binding ElementName="upperLimitDefault" Path="Text" />
     <Binding ElementName="upperLimitMaximum"  Path="Text" />
     <Binding ElementName="upperLimitMinimum"  Path="Text" />
  </MultiBinding>
</DataTrigger.Binding>
 <Setter Property="TextBox.Foreground" Value="Red"/>
</DataTrigger>
 </Style.Triggers>

          <Setter Property="TextBox.Foreground" Value="{Binding ElementName=MenuItem, Path=IsEnabled, Mode=OneWayToSource, Converter={StaticResource myColorErrorConverter}}" />
      </Style>

所以现在启动时会访问第二个转换器并相应地禁用/启用menuitem,但是在应用程序运行期间,当文本框前景发生变化时,只访问第一个转换器并且颜色会改变但是第二个转换器不被访问

1 个答案:

答案 0 :(得分:2)

通过评论,您似乎在样式设置器中设置了Foreground属性。此赋值的优先级低于&#34;本地值&#34;由前景绑定指定,因此无效。

您可以替换

<TextBox Foreground="{Binding ...}" ... />

通过这样的样式设置器(或将其添加到已定义的TextBox样式):

<TextBox ...>
    <TextBox.Style>
        <Style>
            <Setter Property="Foreground" Value="{Binding ...}" />
        </Style>
    </TextBox.Style>
</TextBox>

供参考,请参阅Dependency Property Value Precedence