2013-01-31 3 views
1

Оба случая были решены, посмотрите на комментарии 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&#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(); 
     } 
    } 

} 
+0

Прежде всего, вы не должны существенно изменить свой вопрос, когда он уже был дан ответ. Это действительно сбивает с толку! Лучше задайте другой вопрос. Тогда, что именно означает, что «второй случай не работает»? Вы также получаете там XamlParseException? – Clemens

+0

Извините за изменения, но я не могу ответить на свой вопрос в течение 7 часов из-за низкого рейтинга (здесь я новичок). Второй случай скомпилировал и работал без ошибок, хотя высота TextBlock просто не изменилась, как и должна быть из-за моего multiBinding. Еще раз спасибо. – sdd

ответ

5

Вы должны установить Mode="OneWay" на внутренних переплетах:

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

Если бы вы исследовали XamlParseException в вашем отладчике, вы бы поняли, что там было InnerException с этим сообщением:

Two-way binding requires Path or XPath.


Теперь для второй задачи: Когда вы смотрите на окно вывода в Visual Studio вы можете заметить следующее сообщение:

System.Windows.Data Error: 5 : Value produced by BindingExpression is not valid for target property.; Value='20' MultiBindingExpression:target element is 'TextBlock' (Name=''); target property is 'Height' (type 'Double')

Я думаю, это говорит все.

Следует обратить внимание на параметр targetType, переданный методу Convert. В вашем случае это System.Double.

+0

Спасибо! Я попробую. – sdd

+0

И есть ли способ установить путь вместо этого? Или таких констант нет? Что-то вроде <Источник связывания = "{StaticResource str2}" Путь = "Значение" /> действительно существует? – sdd

+0

Вы привязываетесь к 'string', который не имеет ничего похожего на свойство Value. Следовательно, вы не можете установить «Путь» привязки. Даже тогда строка будет неизменной, что в любом случае заставит вас использовать одностороннюю привязку. – Clemens

Смежные вопросы