【问题标题】:Silverlight 4.0 Databinding to a Dependency PropertySilverlight 4.0 数据绑定到依赖属性
【发布时间】:2011-03-15 07:13:11
【问题描述】:

我很难在嵌套在另一个使用控件内的用户控件上触发绑定。 这是我的层次结构:

  • 导航页
    • 用户控件 A (AthleteMaxGrid)
      • 用户控件 B (PagingControl)

我将 MVVM 设计模型与 MVVMLight 工具包一起用于这些控件。 情况如下: 两个用户控件都有相应的 ViewModel,它们在 XAML 中附加到它们。 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 ViewModel 的片段:

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 代码中创建了 Dependency 属性,如下所示:

    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属性绑定的问题。

有什么想法吗?

提前致谢! 尼克

【问题讨论】:

  • 每当我遇到绑定问题时,我都会添加大量带有各种调试绑定的 TextBlock,以查看属性是什么。因此,带有 Text="{Binding}" 的 TextBlock 将确保您实际绑定到某些东西,并告诉您绑定到什么类型(因此您可以检查 AthleteMaxes 属性是否确实存在于该类型上。Text=" {Binding AthleteMaxes}" 会告诉你该属性是否为空。
  • 好主意。我以前从未尝试过,而且我肯定对解决绑定问题的困难感到沮丧。我会试一试。谢谢!

标签: data-binding silverlight-4.0


【解决方案1】:

这个问题很容易回答。这一行在这里:

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

将 Jake 绑定到 DataContext 的 AthleteMaxes。但是在创建 UserControl 时,您将 DataContext 设置为其他内容!

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

所以现在 Jake 被绑定到 PagingControlVM.AthleteMaxes ... 不存在 :)

【讨论】:

    猜你喜欢
    • 2011-07-29
    • 2011-07-23
    • 2011-04-11
    • 2016-01-22
    • 1970-01-01
    • 2013-02-10
    • 2010-12-27
    • 2011-03-24
    • 2023-03-26
    相关资源
    最近更新 更多