Wpf 文本框上的多重绑定不';行不通

Wpf 文本框上的多重绑定不';行不通,wpf,binding,Wpf,Binding,两个案例都已解决,请查看第一个答案的评论以获取信息。 但这段代码在运行时会出现错误。例外情况是: PresentationFramework.dll中发生了“System.Windows.Markup.XamlParseException”类型的第一次意外异常 当我试图为多重绑定中的第二个绑定设置源时,会发生解析异常。我尝试了很多方法,翻阅了大约20篇文章,虽然我无法找出这里的问题所在 我最好的猜测是,它不知何故连接到了错误的转换器返回类型 顺便说一句,当您将TextBox更改为TextBloc

两个案例都已解决,请查看第一个答案的评论以获取信息。

但这段代码在运行时会出现错误。例外情况是:

PresentationFramework.dll中发生了“System.Windows.Markup.XamlParseException”类型的第一次意外异常

当我试图为多重绑定中的第二个绑定设置源时,会发生解析异常。我尝试了很多方法,翻阅了大约20篇文章,虽然我无法找出这里的问题所在

我最好的猜测是,它不知何故连接到了错误的转换器返回类型

顺便说一句,当您将TextBox更改为TextBlock时,第一种情况有效。第二种情况仍然不起作用

案例1

XAML:

提前谢谢

案例2

同样问题的另一个例子是:


您必须在内部绑定上设置
Mode=“OneWay”

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


如果您在调试器中调查了
XamlParseException
,您可能会意识到此消息存在错误:

双向绑定需要路径或XPath


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

System.Windows.Data错误:5:BindingExpression生成的值为 对目标属性无效。;价值='20' MultiBindingExpression:目标元素为“TextBlock”(名称=“”);目标 属性为“Height”(类型为“Double”)

我想这就说明了一切


您可能应该注意传递给
Convert
方法的
targetType
参数。在您的情况下,它是
System.Double
您必须在内部绑定上设置
Mode=“OneWay”

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


如果您在调试器中调查了
XamlParseException
,您可能会意识到此消息存在错误:

双向绑定需要路径或XPath


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

System.Windows.Data错误:5:BindingExpression生成的值为 对目标属性无效。;价值='20' MultiBindingExpression:目标元素为“TextBlock”(名称=“”);目标 属性为“Height”(类型为“Double”)

我想这就说明了一切


您可能应该注意传递给
Convert
方法的
targetType
参数。您的情况是
系统。请加倍

谢谢!我试试看.有没有办法改为设置路径?或者这些常数没有一个?是否存在类似的内容?您正在绑定到一个
字符串
,该字符串没有类似
值的属性。因此,您无法设置绑定的
路径。即使这样,字符串也是不可变的,这将迫使您使用单向绑定。我明白了,谢谢。第一种情况是用TextBlock替换TextBox解决的,但是第二种情况不起作用。你的建议也很好:要么使用带有Mode=“OneWay”的TextBox,要么使用与Mode无关的TextBlock谢谢!我试试看.有没有办法改为设置路径?或者这些常数没有一个?是否存在类似的内容?您正在绑定到一个
字符串
,该字符串没有类似
值的属性。因此,您无法设置绑定的
路径。即使这样,字符串也是不可变的,这将迫使您使用单向绑定。我明白了,谢谢。第一种情况是用TextBlock替换TextBox,第二种情况不起作用。你的建议也很好:要么使用带有Mode=“OneWay”的TextBox,要么使用与Mode无关的TextBlock。首先,当问题已经得到回答时,你不应该对其进行重大更改。真让人困惑!最好再问一个问题。那么,“第二个案例仍然不起作用”到底是什么意思呢?您是否也收到了XamlParseException?很抱歉更改,但由于评分较低,我在7个小时内无法回答自己的问题(我这里是新手)。第二种情况确实编译并没有错误,尽管TextBlock的高度并没有像我的多重绑定那个样改变。再次感谢。首先,当你的问题已经得到回答时,你不应该对其进行重大改变。真让人困惑!最好再问一个问题。那么,“第二个案例仍然不起作用”到底是什么意思呢?您是否也收到了XamlParseException?很抱歉更改,但由于评分较低,我在7个小时内无法回答自己的问题(我这里是新手)。第二种情况确实编译并没有错误,尽管TextBlock的高度并没有像我的多重绑定那个样改变。再次感谢。
        <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();
      }
  }

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