2011-03-15 100 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 ......不存在:)