在对象的构造函数中使用属性失败

时间:2012-03-13 09:59:37

标签: c# wpf xaml constructor

我有一个像这样定义的类:

class TouchScreenDisabledGrid:DataGrid,INotifyPropertyChanged

我想改变我的类行为的soome,并在它的属性上删除它,在窗口中使用它时设置了xaml。

例如以下内容:

<my:TouchScreenDisabledGrid x:Name="dataGridView" Tag="13"  />

如果在我的构造函数中我尝试检查此值,将导致异常:

    public TouchScreenDisabledGrid(){
            Console.WriteLine(this.Tag.ToString());
    }

为什么这样,我如何检查并使用它?

2 个答案:

答案 0 :(得分:2)

XAML中定义的对象是使用默认构造函数构建的,然后然后设置它们的属性。所以想象一下:

<my:TouchScreenDisabledGrid x:Name="dataGridView" Tag="13"  />

道德等同于此:

var g = new TouchScreenDisabledGrid();
g.Name = "dataGridView";
g.Tag = "13";

现在应该明白为什么Tag在你的构造函数中是null,因此当你调用NullReferenceException时,你得到ToString()

继续进一步说,你不能在构造函数中使用依赖于所设置的对象属性的经典模型。您必须找到另一种实现目标的方法 - 取决于目标的确切方式(例如,您可以使用INotifyPropertyChanged来检测已设置的属性;或者您可以收听在视觉的生命周期中稍后触发,并从那里获取值。

答案 1 :(得分:2)

如果在XAML中设置了属性,则不会在构造函数中设置该属性。使用OnLoaded覆盖来执行此操作。