2009-11-11 186 views
2

我有一個使用MVVM的應用程序。主窗口上有幾個項目綁定到該窗口的ViewModel。當我運行它時,一切正常。但是,當我將一個用戶控件添加到主窗口並嘗試綁定到其某個依賴項對象時,它會引發異常(「對象引用未設置爲對象的實例」)。異常窗口只是彈出在屏幕上,並沒有鏈接到代碼中的任何特定位置。並且異常中的任何其他信息都沒有幫助。WPF MVVM用戶控件綁定問題

我已經盡力追查這件事了,但我沒有任何運氣。在窗口的構造函數中,我檢查並驗證了它試圖綁定的項目存在並且是一個對象(int [])。我也手動設置了構造函數中的屬性有問題。 這裏有一些代碼片段,如果任何人可以注意到任何東西。

這裏就是我用的是用戶控制和嘗試綁定到「視圖」特性

<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]; 

最後她e是在用戶控制

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); } 
    } 

我不知道該視圖屬性,如果這是足夠的信息來解決任何問題,所以如果更多的代碼是REQ請讓我知道。如果有人傾向於看這個項目,我也可以編制項目。提前致謝。

回答

2

當您初始化依賴項屬性上的FrameworkPropertyMetaData時,您可以嘗試初始化數組。

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

我認爲該程序在它設法將依賴項屬性綁定到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> 
+0

我試過了(看我上面的最後一條評論),但它沒有工作:( – 2009-11-17 12:31:26

+0

對不起,我不確定你的意思是什麼意思。你試過用新的int [256]替換你最後一段代碼中的null嗎? – 2009-11-17 13:59:54

+0

我想你想發送整個項目我會看看雖然我對wpf很新,所以我可能也不會工作 – 2009-11-17 14:04:57

1

使用調試器獲取異常堆棧跟蹤。這應該有助於你縮小問題範圍。

有幾種方法可以做到這一點。例如,您應該只能查看異常的詳細信息。或者,您可以打開一個觀察窗口並輸入表達式$exception,然後點擊評估。

+0

當我看到的細節(我這樣做過)堆棧跟蹤停止在「的InitializeComponent();」在主窗口代碼後面。如果我進入InitializeComponent,異常窗口在不同的地方彈出並且細節與以前相同。 – 2009-11-11 19:19:56

+0

通常如果調試器在InitializeComponent中死亡是一些無效的xaml – 2009-11-11 20:40:34

+0

yup,它必須在你的xaml中。 InitializeComponent嘗試實例化在xaml中指定的所有控件。這可能是中世紀的,但嘗試刪除.xaml中的控件,直到不會彈出異常。 – Jose 2009-11-12 04:41:38