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
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
</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>