我有一个使用MVVM的应用程序。我在主窗口上有几个项目绑定到该窗口的ViewModel。当我运行它时一切正常。但是,当我向主窗口添加用户控件并尝试绑定到其中一个依赖项对象时,它会抛出异常(“对象引用未设置为对象的实例”)。异常窗口只会弹出屏幕,不会链接到代码中的任何特定位置。并且异常中的任何其他信息都没有帮助。
我已尽力追查此事,但我没有运气。在窗口的构造函数中,我检查并验证了它试图绑定的项目是否存在并且是一个对象(int [])。我还在构造函数中手动设置属性有问题。 以下是一些代码片段,如果有人可以注意到任何事情。
这是我使用用户控件并尝试绑定到'view'属性的地方
<local:Histogram Grid.Row="2" Grid.ColumnSpan="2"
View="{Binding Path=HistogramData}"
Foreground="{DynamicResource FontColor}"
BucketStroke="{DynamicResource BucketStrokeBrush}"
BucketFill="{DynamicResource BucketFillBrush}"
SelectedBrush="{DynamicResource FamilyEditListViewSelectedBrush}"
DisabledForegroundBrush="{DynamicResource DisabledForegroundBrush}"
AxisBrush="{DynamicResource AxisBrush}"
MaxHeight="130" />
以下是我尝试绑定到的视图模型中的字段:
public int[] HistogramData
{
get
{
return histogramData;
}
set
{
if (value != histogramData)
{
histogramData = value;
RaisePropertyChanged("HistogramData");
}
}
}
在视图模型的构造函数中,我实例化了对象
histogramData = new int[256];
最后这里是用户控件中的view属性
public static readonly DependencyProperty ViewProperty =
DependencyProperty.Register("View",
typeof(int[]),
typeof(Histogram),
new FrameworkPropertyMetadata(null,
FrameworkPropertyMetadataOptions.AffectsRender,
new PropertyChangedCallback(ViewProperty_Changed)));
public int[] View
{
get { return (int[])GetValue(ViewProperty); }
set { SetValue(ViewProperty, value); }
}
我不知道这是否足以解决任何问题所以如果需要更多代码请告诉我。如果有人倾向于看那个,我也可以拉上项目。提前谢谢。
答案 0 :(得分:2)
在初始化依赖项属性上的FrameworkPropertyMetaData时,可以尝试初始化数组。
new FrameworkPropertyMetadata(new int [256],
FrameworkPropertyMetadataOptions.AffectsRender,
new PropertyChangedCallback(ViewProperty_Changed))
我认为程序可能在设置将依赖项属性绑定到viewmodel属性之前遇到空引用异常。
好的,我已经看过你的示例项目,并认为我有一个解决方案。
将viewmodel中的int[]
更改为List<int>
。
我不确定为什么会这样。我希望list<int>
没有技术理由不适合你。
以下是我在解决方案中所做的更改
public List<int> CustomData
{
get
{
return new List<int>(){0,1,2,3};
}
set
{
}
}
在arraycontrol代码隐藏
中public static readonly DependencyProperty DataProperty =
DependencyProperty.Register("Data",
typeof(List<int>),
typeof(ArrayControl),
new FrameworkPropertyMetadata(new List<int>()));
public List<int> Data
{
get { return (List<int>)GetValue(DataProperty); }
set { SetValue(DataProperty, value); }
}
在arraycontrol.xaml中。刚添加列表框以显示数据绑定工作
<UserControl x:Class="UserControlWithArray.Controls.ArrayControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="300" Width="300">
<Grid>
<TextBlock x:Name="MessageTextBlock" Text="ArrayControl"/>
<ListBox ItemsSource="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}, Path=Data}"/>
</Grid>
</UserControl>
答案 1 :(得分:1)
使用调试器获取异常堆栈跟踪。这应该可以帮助你缩小问题范围。
有几种方法可以做到这一点。例如,您应该只能查看异常的详细信息。或者您可以打开观察窗口并输入表达式$exception
,然后点击评估。