2013-01-31 1 views
1

두 경우 모두 해결되었으므로 정보에 대한 첫 번째 답변 의견을 살펴보십시오.텍스트 상자의 멀티 바인딩이 작동하지 않습니다.

이 코드는 런타임에 오류가 발생하지만 컴파일됩니다. 예외는 말한다 :

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

MultiBinding에서 두 번째 바인딩 소스를 설정하려고 할 때 구문 분석 예외가 발생합니다. 나는 많은 방법의 지옥을 시도하고 ~ 20 기사를 통해 파고 있지만, 나는 여기서 무엇이 잘못되었는지를 알 수 없다.

가장 좋은 추측은 어떻게 든 컨버터의 잘못된 반환 유형에 연결되어 있다는 것입니다.

그리고 btw, 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(); 
    } 
} 

감사합니다!

CASE2

그리고 같은 문제에 대한 또 다른 경우 :

 <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(); 
     } 
    } 

} 
당신은 내부 바인딩에 Mode="OneWay"을 설정해야
+0

먼저, 이미 답변 한 경우 질문을 크게 변경해서는 안됩니다. 정말 혼란스러워! 다른 질문을하는 것이 좋습니다. 그렇다면 정확히 "두 번째 사례는 아직 작동하지 않는다"는 것을 의미합니까? XamlParseException도 거기에 있습니까? – Clemens

+0

변경에 대해 죄송 합니다만, 낮은 등급으로 인해 더 많은 시간 동안 내 자신의 질문에 답변 할 수 없습니다. 두 번째 경우는 오류없이 컴파일되고 작업되었습니다. 그러나 TextBlock의 높이가 내 멀티 바인딩으로 인해 변경되지 않았습니다. 다시 한번 감사드립니다. – sdd

답변

5

:

<MultiBinding Converter="{StaticResource myStringConverter}"> 
    <Binding Source="{StaticResource str1}" Mode="OneWay" /> 
    <Binding Source="{StaticResource str2}" Mode="OneWay" /> 
</MultiBinding> 
두 번째 문제에 대한 지금

Two-way binding requires Path or XPath.


: 당신은 출력 창에서 볼당신이 당신의 디버거에서 XamlParseException을 조사했다면

, 당신은이 메시지와 함께 InnerException 있다는 것을 깨달았을 것이다 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')

나는 그게 전부라고 생각합니다.

Convert 메서드에 전달 된 targetType 매개 변수에주의해야합니다. 귀하의 경우에는 System.Double입니다.

+0

감사합니다. 나는 그것을 시험해 보겠다. – sdd

+0

대신 경로를 설정하는 방법이 있습니까? 또는 그러한 상수에는 하나도 없습니까? 예 : <바인딩 소스 = "{StaticResource str2}"경로 = "값"/> 존재합니까? – sdd

+0

'string'에 바인딩하고 있습니다.'Value' 속성과 아무런 관련이 없습니다. 따라서 바인딩의 '경로'를 설정할 수 없습니다. 그럼에도 불구하고 문자열은 불변이므로 어쨌든 단방향 바인딩을 사용해야합니다. – Clemens

관련 문제