2010-09-13 4 views
2

Je dispose d'un contrôle utilisateur dont j'ai besoin pour définir un DataContext spécifique. L'usercontrol utilise des convertisseurs multivalués. Toutefois, la liaison dans multivalueconverter ne parvient pas à utiliser le datacontext. Cela fonctionne bien pour les convertisseurs de valeur régulière. Quelqu'un sait ce qu'il se passe? Pour clarifier, le code ci-dessous n'est pas similaire à mon code réel, c'est juste un exemple reproduisant mon problème. Par exemple, mes convertisseurs multivalués prennent plus d'un argument.Impossible d'accéder au datacontext dans multivalueconverter

XAML:

<Window x:Class="MultConvTest.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:MultConvTest="clr-namespace:MultConvTest" 
    Title="Window1" Height="300" Width="300"> 

    <Window.Resources> 
     <MultConvTest:MyValueConverter x:Key="MyValueConverter" /> 
     <MultConvTest:MyMultiConverter x:Key="MyMultiConverter" /> 
    </Window.Resources> 

    <StackPanel> 

     <!--This works, output is Formatted: 7--> 
     <TextBlock 
      DataContext="{Binding Path=Data}" 
      Text="{Binding Path=Length, Converter={StaticResource MyValueConverter}}" /> 

     <!--This works, output is Formatted: 7--> 
     <TextBlock> 
      <TextBlock.Text> 
       <MultiBinding Converter="{StaticResource MyMultiConverter}"> 
        <Binding Path="Data.Length" /> 
       </MultiBinding> 
      </TextBlock.Text> 
     </TextBlock> 

     <!--This fails, the converter never access the DataContext of the textbox--> 
     <TextBlock 
      DataContext="{Binding Path=Data}"> 
      <TextBlock.Text> 
       <MultiBinding Converter="{StaticResource MyMultiConverter}"> 
        <Binding Path="Length" /> 
       </MultiBinding> 
      </TextBlock.Text> 
     </TextBlock> 

    </StackPanel> 

</Window> 

code derrière:

using System; 
using System.Collections.Generic; 
using System.Windows; 
using System.Windows.Data; 

namespace MultConvTest 
{ 
    public partial class Window1 : Window 
    { 
     public Window1() 
     { 
      InitializeComponent(); 

      DataContext = this; 
     } 

     public string Data 
     { 
      get { return "My Text"; } 
     } 
    } 

    public class MyValueConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      int number = (int)value; 
      return string.Format("Formatted: {0}", number); 
     } 

     public object ConvertBack(object value, Type targetTypes, object parameter, System.Globalization.CultureInfo culture) 
     { 
      throw new NotImplementedException(); 
     } 
    } 

    public class MyMultiConverter : IMultiValueConverter 
    { 
     public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      // This will fail when DataContext is set. values[0] is of type Ms.Internal.NamedObject 
      // with value DependencyProperty.UnsetValue. 
      int number = (int)values[0]; 
      return string.Format("Formatted: {0}", number); 
     } 

     public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) 
     { 
      throw new NotImplementedException(); 
     } 
    } 
} 

Répondre

4

Tu ne vas pas aimer ça ;-)

mettre simplement la ligne DataContext=thisavantInitializeComponent()

Il semble que MultiConverter pour la troisième zone de texte est déclenchée avant que le DataContext global est défini, produisant ainsi en fait une erreur de référence nulle ...

+0

Cela l'a corrigé, merci. Je pense que c'est un bug WPF avec la façon dont WPF utilise les convertisseurs multivalués. –

+0

C'est bon à savoir, merci pour la contribution! Que se passe-t-il lorsque DataContext est défini sur une instance d'une autre classe? Le convertisseur sera-t-il recherché dans cette instance de classe? Toujours obtenir NullReference. – Dr1Ku

+0

@ Dr1Ku Je ne sais pas quelle est votre question: vous obtenez toujours une exception NullReference lorsque vous utilisez 'DataContext = new MyContext()' avant 'InitializeComponent()'? Le convertisseur est une classe séparée qui a besoin des données du Datacontext en tant que paramètre (s) pour sa méthode Convert. – Dabblernl

Questions connexes