WPF转换器抛出对象引用未在设计时设置

时间:2015-12-14 10:39:44

标签: c# wpf xaml converter design-time

我在xaml设计时遇到错误:

  

对象未设置为对象的实例。

它只在设计时发生,并在运行时完美运行。错误来自我的转换器,我在下面的代码。我认为这可能是由于没有检查值是否为null或者如果它为null则返回null,但是我改变了两者并且它没有任何区别。

我们非常感谢您的想法。感谢

public class CouponDataSplitterConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter,     CultureInfo culture)
    {
        if (value != null)
        {
            List<SelectionArea> selectionAreasList =
                new List<SelectionArea>((ObservableCollection<SelectionArea>) value);
            foreach (var area in selectionAreasList)
            {
                if (area.AreaName.Contains(parameter.ToString()))
                {
                    return area.SelectionRows;
                }
            }

            return selectionAreasList;
        }
        return "";
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

XAML:

ItemsSource="{Binding Coupon.SelectionAreas, 
        ConverterParameter='Test Parameter',
        Converter={StaticResource CouponDataSplitterConverter}

堆栈追踪:

at App.UI.Converters.CouponDataSplitterConverter.Convert(Object      value, Type targetType, Object parameter, CultureInfo culture)
at System.Windows.Data.BindingExpression.TransferValue(Object newValue, Boolean isASubPropertyChange)
at System.Windows.Data.BindingExpression.Activate(Object item)
at System.Windows.Data.BindingExpression.AttachToContext(AttachAttempt attempt)
at System.Windows.Data.BindingExpression.AttachOverride(DependencyObject target, DependencyProperty dp)
at System.Windows.Data.BindingExpressionBase.OnAttach(DependencyObject d, DependencyProperty dp)
at System.Windows.StyleHelper.GetInstanceValue(UncommonField`1 dataField, DependencyObject container, FrameworkElement feChild, FrameworkContentElement fceChild, Int32 childIndex, DependencyProperty dp, Int32 i, EffectiveValueEntry& entry)
at System.Windows.StyleHelper.GetChildValueHelper(UncommonField`1 dataField, ItemStructList`1& valueLookupList, DependencyProperty dp, DependencyObject container, FrameworkObject child, Int32 childIndex, Boolean styleLookup, EffectiveValueEntry& entry, ValueLookupType& sourceType, FrameworkElementFactory templateRoot)
at System.Windows.StyleHelper.GetChildValue(UncommonField`1 dataField, DependencyObject container, Int32 childIndex, FrameworkObject child, DependencyProperty dp, FrugalStructList`1& childRecordFromChildIndex, EffectiveValueEntry& entry, ValueLookupType& sourceType, FrameworkElementFactory templateRoot)
at System.Windows.StyleHelper.GetValueFromTemplatedParent(DependencyObject  container, Int32 childIndex, FrameworkObject child, DependencyProperty dp,  FrugalStructList`1& childRecordFromChildIndex, FrameworkElementFactory templateRoot, EffectiveValueEntry& entry)
at System.Windows.StyleHelper.ApplyTemplatedParentValue(DependencyObject container, FrameworkObject child, Int32 childIndex, FrugalStructList`1& childRecordFromChildIndex, DependencyProperty dp, FrameworkElementFactory templateRoot)
at System.Windows.StyleHelper.InvalidatePropertiesOnTemplateNode(DependencyObject container, FrameworkObject child, Int32 childIndex, FrugalStructList`1& childRecordFromChildIndex, Boolean isDetach, FrameworkElementFactory templateRoot)
at System.Windows.FrameworkTemplate.InvalidatePropertiesOnTemplate(DependencyObject container, Object currentObject)
at System.Windows.FrameworkTemplate.HandleBeforeProperties(Object createdObject, DependencyObject& rootObject, DependencyObject container, FrameworkElement feContainer, INameScope nameScope)
at System.Windows.FrameworkTemplate.<>c__DisplayClass0.<LoadOptimizedTemplateContent>b__5(Object sender, XamlObjectEventArgs args)
at System.Xaml.XamlObjectWriter.OnBeforeProperties(Object value)
at System.Xaml.XamlObjectWriter.Logic_CreateAndAssignToParentStart(ObjectWriterContext ctx)
at System.Xaml.XamlObjectWriter.WriteStartMember(XamlMember property)
at System.Xaml.XamlWriter.WriteNode(XamlReader reader)
at System.Windows.FrameworkTemplate.LoadTemplateXaml(XamlReader templateReader, XamlObjectWriter currentWriter)
at System.Windows.FrameworkTemplate.LoadTemplateXaml(XamlObjectWriter objectWriter)
at System.Windows.FrameworkTemplate.LoadOptimizedTemplateContent(DependencyObject container, IComponentConnector componentConnector, IStyleConnector styleConnector, List`1 affectedChildren, UncommonField`1 templatedNonFeChildrenField)
at System.Windows.FrameworkTemplate.LoadContent(DependencyObject container, List`1 affectedChildren)
at System.Windows.StyleHelper.ApplyTemplateContent(UncommonField`1 dataField, DependencyObject container, FrameworkElementFactory templateRoot, Int32 lastChildIndex, HybridDictionary childIndexFromChildID, FrameworkTemplate frameworkTemplate)
at System.Windows.FrameworkTemplate.ApplyTemplateContent(UncommonField`1 templateDataField, FrameworkElement container)
at System.Windows.FrameworkElement.ApplyTemplate()
at System.Windows.FrameworkElement.MeasureCore(Size availableSize)
at System.Windows.UIElement.Measure(Size availableSize)
at System.Windows.ContextLayoutManager.UpdateLayout()
at System.Windows.UIElement.UpdateLayout()

2 个答案:

答案 0 :(得分:2)

如果您收到 NullReferenceException ,则表示某些内容为空。

您的代码明确检查value参数为null。但是,您在foreach

中有这行代码
if (area.AreaName.Contains(parameter.ToString()))

如果AreaName属性具有空值(Contains方法调用将抛出)或parameter参数,则此行可能会抛出 NullReferenceException 提供给该方法的为null(ToString方法调用将抛出)。

在您的方法中放置一些调试代码可能值得,因此您可以检查您正在使用的变量的状态。我知道你不能使用调试器,因为这是一个设计时问题,因此你可能需要登录临时文本文件或类似的东西。

答案 1 :(得分:1)

要判断什么设置为null并不容易,如果未在viewmodel构造函数中初始化值,则该值可能最初为null(在本例中我假设为MarkSenseCoupon)。看看Debugging Your Custom Control at Design Time有关如何在设计时调试控件的步骤,只需在convert方法的开头添加一个断点即可确定哪个对象设置为null。

这个问题似乎也涉及类似的问题WPF Converter casting causes Visual Studio designer exception ......