WPF MVVM用户控件绑定问题

时间:2009-11-11 18:47:32

标签: wpf user-controls mvvm binding

我有一个使用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); }
    }

我不知道这是否足以解决任何问题所以如果需要更多代码请告诉我。如果有人倾向于看那个,我也可以拉上项目。提前谢谢。

2 个答案:

答案 0 :(得分:2)

在初始化依赖项属性上的FrameworkPropertyMetaData时,可以尝试初始化数组。

 new FrameworkPropertyMetadata(new int [256],
                              FrameworkPropertyMetadataOptions.AffectsRender,  
                              new PropertyChangedCallback(ViewProperty_Changed))

我认为程序可能在设置将依赖项属性绑定到viewmodel属性之前遇到空引用异常。


好的,我已经看过你的示例项目,并认为我有一个解决方案。

将viewmodel中的int[]更改为List<int>。 我不确定为什么会这样。我希望list<int>没有技术理由不适合你。

以下是我在解决方案中所做的更改

在viewmodel中

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,然后点击评估。