【问题标题】:WPF UserControl InitializeComponent ExceptionWPF 用户控件初始化组件异常
【发布时间】:2012-02-12 01:50:10
【问题描述】:

我有一个强类型的 View 类,我的所有 UserControls 都从该类派生。它看起来或多或少是这样的:

public class View<TContext> : UserControl 
{

    /// <summary>
        /// Gets or sets a value indicating whether to auto create the data context type.
        /// </summary>
    public static DependencyProperty AutoCreateDataContextProperty = DependencyProperty.Register("AutoCreateDataContext", typeof(bool), typeof(View<TContext>), new PropertyMetadata(false));
    /// <summary>
    /// Gets or sets a value indicating whether to auto create the data context type.
    /// </summary>
    /// <value>
    ///     <c>true</c> if [auto resolve data context]; otherwise, <c>false</c>.
    /// </value>
    public bool AutoCreateDataContext
    {
        get { return (bool)GetValue(AutoCreateDataContextProperty); }
        set { SetValue(AutoCreateDataContextProperty, value); }
    }

    /// <summary>
    /// Gets or sets the view model.
    /// </summary>
    /// <value>
    /// The view model.
    /// </value>
    public new TContext DataContext
    {
        get
        {
            if (AutoCreateDataContext && !DesignerProperties.GetIsInDesignMode(new ContentControl()))
            {
                base.DataContext = ServiceProvider.Current.GetService<TContext>();
            }
            return (TContext)base.DataContext;
        }
        set { base.DataContext = value; }
    }
}

关于 AutoCreateDataContext 的内容是新的......并且是我的问题的来源。将此添加到View&lt;TContext&gt; 基类本身并没有引起任何问题......但是一旦我在我的派生视图之一中将值设置为 true:

<s:View x:TypeArguments="local:PersonSearchViewModel"
    x:Class="PersonSearchView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" ...
             Height="600" Width="800" Background="White" AutoCreateDataContext="True">

该视图的InitializeComponent 抛出以下异常:

System.NullReferenceException occurred
  Message=Object reference not set to an instance of an object.
  Source=PresentationFramework
  StackTrace:
       at System.Windows.Markup.WpfXamlLoader.TransformNodes(XamlReader xamlReader, XamlObjectWriter xamlWriter, Boolean onlyLoadOneNode, Boolean skipJournaledProperties, Boolean shouldPassLineNumberInfo, IXamlLineInfo xamlLineInfo, IXamlLineInfoConsumer xamlLineInfoConsumer, XamlContextStack`1 stack, IStyleConnector styleConnector)
       at System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri)
       at System.Windows.Markup.WpfXamlLoader.LoadBaml(XamlReader xamlReader, Boolean skipJournaledProperties, Object rootObject, XamlAccessLevel accessLevel, Uri baseUri)
       at System.Windows.Markup.XamlReader.LoadBaml(Stream stream, ParserContext parserContext, Object parent, Boolean closeStream)
       at System.Windows.Application.LoadComponent(Object component, Uri resourceLocator)
       at ....

一旦我从标记中删除 AutoCreateDataContext=True,它就会再次正常工作。没有内部异常或进一步的异常细节。我该如何调试/解决这个问题?

【问题讨论】:

    标签: c# .net wpf xaml


    【解决方案1】:

    我做了一些猜测然后反汇编,发现它是 WPF 如何处理在通用 DependencyObjects 上声明的 DependencyProperties 的一个错误(比如我的 View&lt;T&gt;)。

    创建了一个抽象的非泛型基类(称为 View,which View&lt;T&gt; now inherits from)并在那里声明了我的 DependencyProperties。问题解决了。

    我想我已经习惯了微软的质量有多差......所以我实际上已经开始认识到此类错误的趋势。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-17
      相关资源
      最近更新 更多