DependencyProperty PropertyChangedCallback在XAML中导致NullReferenceException

时间:2010-02-19 10:12:10

标签: exception xaml dependency-properties

我有一个子类UserControl,它是我主窗口的内容。我向我的usercontrol添加了DepedencyProperty,类型为ResizeMode,PropertyChanged回调将主窗口的ResizeMode设置为正确的值。它运行正常。我可以从后面的代码或XAML中设置它,它可以正常工作。 但是,当我从XAML设置它时,设计器会在PropertyChanged回调中设置窗口调整大小的代码中抛出一个未设置为对象异常实例的Object引用。

<classes:MyUserControl ResizeMode="NoResize">
     <...>
</classes:MyUserControl>

这是回调。 MainWindow是对父窗口的引用。

private static void OnResizeModeChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
{
     (o as MyUserControl).MainWindow.ResizeMode = (ResizeMode) e.NewValue;
}

public ResizeMode ResizeMode
{
    get { return (ResizeMode) GetValue(ResizeModeProperty); }
    set { SetValue(ResizeModeProperty, value); }
}

public static readonly DependencyProperty ResizeModeProperty =
            DependencyProperty.Register("SizeToFit", typeof(ResizeMode), typeof(MyUserControl),
                new UIPropertyMetadata(ResizeMode.CanResize, new PropertyChangedCallback(OnResizeModeChanged)));

我可以忽略它,或者在后面的代码中设置它,但我真的不明白这个错误的原因,我宁愿在XAML中设置它。

任何人都能解释一下吗?

2 个答案:

答案 0 :(得分:1)

您是否确切知道NullReferenceExceptoin被抛出的位置?例如,如果您尝试这样做:

var uc = o as MyUserControl;
var mw = uc.MainWindow;

mw.ResizeMode = (ResizeMode)e.NewValue;

...那么是第二行还是第三行引发的异常?

我的感觉是,ResizeMode首次被赋值时,MainWindow尚未被分配,因此访问MainWindow.ResizeMode会导致错误。

如果是这种情况,可以忽略:

var mw = (o as MyUserControl).MainWindow;
if (mw == null) return;

但您可能希望在某处缓存该值,然后在稍后分配MainWindow时将其分配给MainWindow.ResizeMode。

答案 1 :(得分:0)

好吧,我想我找到了罪魁祸首。 MainWindow由App.Current.MainWindow设置。

现在从我所看到的,Current.MainWindow在设计时不存在,然后当OnResizeModeChanged方法在设计时触发,MainWindow.ResizeMode,繁荣!例外!

我将这一行添加到我的方法中:

if ((bool) (DesignerProperties.IsInDesignModeProperty.GetMetadata(typeof(DependencyObject)).DefaultValue)) return;

我遇到了另一个问题,我的XAML突然无法加载我的usercontrol,因为我在构造函数中的MainWindow上设置了一些属性,添加了这个:

 if (DesignerProperties.GetIsInDesignMode(this))
          return;