2011-03-15 85 views
0

我很難讓綁定在嵌套在另一個使用控件內的用戶控件上觸發。 這裏是我的層次:Silverlight 4.0數據綁定到依賴項屬性

  • 的導航頁面
    • 用戶控件(AthleteMaxGrid)
      • 用戶控制B(PagingControl)

我使用帶有用於這些控件的MVVMLight工具包的MVVM設計模型。 以下是這種情況: 兩個用戶控件都在XAML中有相應的ViewModel。 AthleteMaxGrid的視圖模型有一個Observable Collection(AthleteMaxes)屬性,我想綁定到PagingControl。此屬性也被綁定到AthleteMaxGrid控件的數據視圖中,因此它知道它正在正確填充。

下面是代碼:

AthleteMaxGrid XAML:

 <UserControl ... 
     DataContext="{Binding AthleteMaxGrid, Source={StaticResource Locator}}"> 
    .... 
    <StackPanel Orientation="Horizontal"> 
     ... 
     <my:PagingControl Jake="{Binding AthleteMaxes}" /> 
    </StackPanel> 
    <telerik:RadGridView x:Name="rgvMaxes" IsScrolling="False" 
     ItemsSource="{Binding AthleteMaxes}" AutoGenerateColumns="False" 
     IsBusy="{Binding IsBusy}" >... 

下面是從AthleteMaxGrid視圖模型一個snipit:

public const string AllMaxesPropertyName = "AthleteMaxes"; 

private ObservableCollection<AthleteMaxTableItem> _allMaxes = new ObservableCollection<AthleteMaxTableItem>(); 

    /// <summary> 
    /// Gets the AthleteMaxes property. 
    /// </summary> 
    public ObservableCollection<AthleteMaxTableItem> AthleteMaxes 
    { 
     get 
     { 
      return _allMaxes; 
     } 

     set 
     { 
      if (_allMaxes == value) 
      { 
       return; 
      } 

      _allMaxes = value; 

      // Update bindings, no broadcast 
      RaisePropertyChanged("AthleteMaxes"); 
     } 
    } 

下面是從PagingControl的XAML:

<UserControl ... 
      x:Name="rootElement" 
     DataContext="{Binding PagingControlVM, Source={StaticResource Locator}}"> 
... 
</UserControl> 

我創造了PagingControl代碼依賴屬性的背後是這樣的:

public const string JakePropertyName = "Jake"; 

    public object Jake 
    { 
     get 
     { 
      return (object)GetValue(JakeProperty); 
     } 
     set 
     { 
      SetValue(JakeProperty, value); 
     } 
    } 

    public static readonly DependencyProperty JakeProperty = DependencyProperty.Register(
     JakePropertyName, 
     typeof(object), 
     typeof(PagingControl), 
     new PropertyMetadata(null, 
      new PropertyChangedCallback(onJakeChanged))); 


    private static void onJakeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     MessageBox.Show(d.GetType().ToString()); 
    } 

在這一點上我只是試圖讓我的回調函數命中(onJakeChanged),所以我知道數據被正確進來和我可以移動到綁定我的控件的下一個階段,但它沒有被擊中。

如果我將AthleteMaxGrid上的XAML中的Jake屬性設置爲「測試」之類的簡單內容,則回調會正確命中。這似乎是viewModel屬性綁定的問題。

任何想法?

提前致謝! 尼克

+0

每當我綁定問題我想補充的TextBlocks的負載與各種調試綁定在他們看這些屬性是什麼。所以TextBlock和Text =「{Binding}」將確保你實際上綁定了某些東西,並且會告訴你你綁定了什麼類型(所以你可以檢查AthleteMaxes屬性是否真的存在於這個類型中。 {Binding AthleteMaxes}「會告訴你該屬性是否爲空 – BenCr 2011-03-15 11:01:28

+0

好主意,我從來沒有嘗試過,而且我在確定綁定問題的困難時感到沮喪,我會給它一個旋轉。謝謝! – Nick 2011-03-15 20:01:23

回答

0

這一個很容易回答。此行如下:

<my:PagingControl Jake="{Binding AthleteMaxes}" /> 

將Jake綁定到DataContext的AthleteMaxes。但是,在創建UserControl時,您將DataContext設置爲其他內容!

<UserControl x:Name="rootElement" DataContext="{Binding PagingControlVM, Source=StaticResource Locator}}"> 

所以現在傑克勢必PagingControlVM.AthleteMaxes ......不存在:)