Оба случая были решены, посмотрите на комментарии 1-го ответа для информации.Multibinding on textbox не работает
Этот фрагмент кода компилируется, хотя и дает ошибку во время выполнения. Исключение составляет:
A first chance exception of type 'System.Windows.Markup.XamlParseException' occurred in PresentationFramework.dll
.
Исключение синтаксического анализа происходит, когда я пытаюсь установить источник для второго связывания в MultiBinding. Я пробовал целый ряд способов и выкопал через ~ 20 статей, хотя я не могу понять, что здесь не так.
Моя лучшая догадка заключается в том, что она как-то связана с неправильным обратным типом конвертера.
И, кстати, при изменении TextBox на TextBlock работает 1-й случай. Второй случай не работает.
case1
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 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(); } } }
Прежде всего, вы не должны существенно изменить свой вопрос, когда он уже был дан ответ. Это действительно сбивает с толку! Лучше задайте другой вопрос. Тогда, что именно означает, что «второй случай не работает»? Вы также получаете там XamlParseException? – Clemens
Извините за изменения, но я не могу ответить на свой вопрос в течение 7 часов из-за низкого рейтинга (здесь я новичок). Второй случай скомпилировал и работал без ошибок, хотя высота TextBlock просто не изменилась, как и должна быть из-за моего multiBinding. Еще раз спасибо. – sdd