【问题标题】:Multibinding on textbox doesn't work文本框上的多重绑定不起作用
【发布时间】:2013-01-31 11:36:44
【问题描述】:

两种情况都已解决,请查看第一个答案 cmets 以获取信息。

这段代码编译虽然在运行时出错。异常说:

A first chance exception of type 'System.Windows.Markup.XamlParseException' occurred in PresentationFramework.dll.

当我尝试为 MultiBinding 中的第二个绑定设置源时,会发生解析异常。我已经尝试了很多方法并浏览了大约 20 篇文章,但我无法找出这里有什么问题。

我最好的猜测是它以某种方式连接到了错误的转换器返回类型。

而且,顺便说一句,当您将 TextBox 更改为 TextBlock 时,第一种情况有效。第二种情况还是不行。

案例1

XAML:

<UserControl x:Class="Draft.MainControl"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:draft="clr-namespace:Draft" 
        xmlns:s="clr-namespace:System;assembly=mscorlib" 
        Height="350" Width="352">

    <UserControl.Resources>

        <s:String x:Key="str1">HELLO</s:String>
        <s:String x:Key="str2">WORLD</s:String>

        <draft:StringConverter x:Key="myStringConverter"/>

     </UserControl.Resources>

    <Grid>

        <TextBox Name="tb1">
            <TextBox.Text>
                <MultiBinding Converter="{StaticResource myStringConverter}">
                    <Binding Source="{StaticResource str1}" />
                    <Binding Source="{StaticResource str2}" />
                </MultiBinding>
            </TextBox.Text>
        </TextBox>


    </Grid>
</UserControl>

代码背后:

public class StringConverter : IMultiValueConverter
{
    public object Convert( object[] values, Type targetType, object parameter, CultureInfo culture )
    {
        return ( values[0].ToString() + values[1].ToString() );
    }

    public object[] ConvertBack( object values, Type[] targetType, object parameter, CultureInfo culture )
    {
        throw new NotImplementedException();
    }
}

提前致谢!

案例2

同样问题的另一种情况:

        <Grid>
            <TextBlock TextWrapping="WrapWithOverflow">

                <TextBlock.Resources>
                    <s:Int32 x:Key="defaultHeight">2</s:Int32>
                    <s:Int32 x:Key="defaultNum">10</s:Int32>
                    <draft:MultiplierConverter x:Key="myConverter"/>
                </TextBlock.Resources>

                <TextBlock.Text>
                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa&#10;
                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa&#10;
                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa&#10;
                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa&#10;
                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa&#10;
                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa&#10;
                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa&#10;
                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa&#10;
                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa&#10;
                </TextBlock.Text>

                <TextBlock.Height>
                    <MultiBinding Converter="{StaticResource myConverter}">
                        <Binding Source="{StaticResource defaultNum}" Mode="OneWay" />
                        <Binding Source="{StaticResource defaultHeight}" Mode="OneWay" />
                    </MultiBinding>
                </TextBlock.Height>
            </TextBlock>
        </Grid>
    </UserControl>
Code behind:
  public class MultiplierConverter : IMultiValueConverter
  {
      public object Convert( object[] values, Type targetType, object parameter, CultureInfo culture )
      {
          if ( values.Count() == 2 && values[0] != DependencyProperty.UnsetValue && values[1] != DependencyProperty.UnsetValue )
          {
              var num = (Int32)values[0];
              var height = (Int32)values[1];

              return ( num * height );
          }

          return 0;
      }

      public object[] ConvertBack( object values, Type[] targetType, object parameter, CultureInfo culture )
      {
          throw new NotImplementedException();
      }
  }

}

【问题讨论】:

  • 首先,当您的问题已经得到回答时,您不应该大幅更改它。这真是令人困惑!最好再问一个问题。那么,究竟是什么意思“第二种情况仍然行不通”?你那里也有 XamlParseException 吗?
  • 抱歉更改,但我可以在这里t answer my own question for 7 more hours due to low rating (Im newbee)。第二种情况确实编译并且没有错误,尽管由于我的多重绑定,TextBlock 的高度并没有像它应该有的那样改变。再次感谢。

标签: wpf binding


【解决方案1】:

你必须在内部绑定上设置Mode="OneWay"

<MultiBinding Converter="{StaticResource myStringConverter}">
    <Binding Source="{StaticResource str1}" Mode="OneWay" />
    <Binding Source="{StaticResource str2}" Mode="OneWay" />
</MultiBinding>

如果您在调试器中调查了XamlParseException,您会发现有一个InnerException 带有此消息:

双向绑定需要 Path 或 XPath。


现在解决您的第二个问题:当您在 Visual Studio 中查看输出窗口时,您可能会看到以下消息:

System.Windows.Data 错误:5:BindingExpression 产生的值是 对目标属性无效。;值='20' MultiBindingExpression:目标元素是'TextBlock'(名称='');目标 属性是“高度”(类型“双”)

我想这说明了一切。

您或许应该注意传递给Convert 方法的targetType 参数。在您的情况下,它是System.Double

【讨论】:

  • 谢谢!我试试看。
  • 有没有办法设置路径呢?或者这样的常数没有一个? 之类的东西确实存在吗?
  • 您正在绑定到一个 string,它与 Value 属性完全不同。因此您不能设置绑定的Path。即使这样,字符串也是不可变的,这将迫使您无论如何都使用单向绑定。
  • 我明白了,谢谢。第一种情况是通过用TextBlock替换TextBox来解决的,但是第二种情况不起作用。
  • 您的建议也很好:您要么使用带有 Mode="OneWay" 的 TextBox,要么使用 TextBlock 而不考虑 Mode
猜你喜欢
  • 2015-08-12
  • 1970-01-01
  • 2011-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-10
  • 1970-01-01
  • 2014-05-11
相关资源
最近更新 更多