2013-01-31 63 views
1

這兩種情況都解決了,請查看第一個回答的註釋以獲取有關信息。對文本框的多重綁定不起作用

這段代碼編譯雖然在運行時出錯。例外說:

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

當我嘗試在MultiBinding中爲第二個綁定設置源時,會發生解析異常。我已經嘗試了很多方法,並通過20篇文章進行了深入研究,儘管我無法找到這裏出了什麼問題。

我最好的猜測是它以某種方式連接到轉換器的錯誤返回類型。

而且,順便說一句,當您將TextBox更改爲TextBlock時,第一種情況適用。第二種情況仍然沒有奏效。

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

謝謝!

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

} 
+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')

我想說這一切。

您應該注意傳遞給Convert方法的參數targetType。在你的情況下,它是System.Double

+0

謝謝!我會試試看。 – sdd

+0

有沒有一種方法來設置路徑呢?或者這樣的常量沒有?類似 確實存在嗎? – sdd

+0

你綁定到'string',它沒有任何像'Value'屬性。因此你不能設置綁定的「路徑」。即使這樣,一個字符串也是不可變的,無論如何這會迫使你使用單向綁定。 – Clemens