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();
}
}
}
Cela l'a corrigé, merci. Je pense que c'est un bug WPF avec la façon dont WPF utilise les convertisseurs multivalués. –
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
@ 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