Wpf Can';多值转换器中的t访问数据上下文
我有一个usercontrol,需要在其上设置特定的DataContext。usercontrol使用多值转换器。但是,多值转换器中的绑定无法使用datacontext。它适用于常规值转换器。有人知道发生了什么吗?为了澄清,下面的代码与我的真实代码不同,它只是一个复制我的问题的示例。例如,我的多值转换器接受多个参数 XAML:Wpf Can';多值转换器中的t访问数据上下文,wpf,datacontext,imultivalueconverter,Wpf,Datacontext,Imultivalueconverter,我有一个usercontrol,需要在其上设置特定的DataContext。usercontrol使用多值转换器。但是,多值转换器中的绑定无法使用datacontext。它适用于常规值转换器。有人知道发生了什么吗?为了澄清,下面的代码与我的真实代码不同,它只是一个复制我的问题的示例。例如,我的多值转换器接受多个参数 XAML: 你不会喜欢这个;-) 只需将行DataContext=this放在InitializeComponent()之前 第三个文本框的多转换器似乎是在设置全局DataConte
你不会喜欢这个;-) 只需将行
DataContext=this
放在InitializeComponent()之前
第三个文本框的多转换器似乎是在设置全局DataContext之前触发的,因此实际上产生了一个空引用错误…修复了它,谢谢。我认为这是WPF如何使用多值转换器的一个WPF错误。很高兴知道,谢谢您的输入!当DataContext设置为另一个类的实例时会发生什么?在该类的实例中会寻找转换器吗?仍然得到NullReference。@Dr1Ku我不确定您的问题是:在
InitializeComponent()之前使用DataContext=new MyContext()
时,仍然会得到NullReference异常?转换器是一个单独的类,需要Datacontext中的数据作为其转换方法的参数。
<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>
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();
}
}
}