【问题标题】:DataContext, DataBinding and Element Binding in SilverlightSilverlight 中的 DataContext、DataBinding 和元素绑定
【发布时间】:2011-01-30 15:36:15
【问题描述】:

我正在努力让我的数据绑定正常工作。我有理由相信我正在努力完成的事情无法完成,但我们会看到我得到什么答案。

我有一个用户控件。此 UserControl 仅包含一个按钮。现在在后面的代码中,我有一个属性名称 IsBookmarked。当设置 IsBookmarked 时,将运行代码以动画按钮的外观。这个想法是您单击按钮,它会在视觉上发生变化。我们将此 UserControl 称为 Bookmark 控件。

现在我有了另一个控件,我们将其称为 FormControl。我的 FormControl 包含一个子 Bookmark 控件。我试图在我的书签控件上进行数据绑定,但它不起作用。这里有一些代码可以帮助你。

这是我的控件的 XAML 和 Loaded 事件处理程序。如您所见,它包含一个作为自定义控件(书签)的子元素。因此,一旦加载此控件,它的 DataContext 就会设置为 Employee 对象的新实例。 Silverlight 还将我的子书签控件的 DataContext 属性设置为相同的实例。我已经通过调试验证了这一点。如果我的父级设置了有效的 DataContext,那么为什么我的子级控件(书签)属性数据不能绑定到它?

<UserControl ......>
    <q:Bookmark x:Name="BookMarkControl1" IsBookmarked="{Binding IsSiteBookmarked}" />
</UserControl>

public void Control_Loaded(object sender, EventArgs e)
{
    DataContext = new Employee { IsSiteBookmarked = True };

}

这是我下面的自定义控件。显然它包含的内容不止这些,但为了便于阅读,我已将其缩减为我尝试数据绑定到的属性。

//this is the bookmark control. I've included this control within another control, and I'm trying to databind to properties within my parents DataContext
public partial class Bookmark : UserControl
{

    bool _IsBookmarked= false;
    public bool IsBookmarked
    {
        get {return _IsBookmarked;}
        set { 
                 _IsBookmarked= value;
                 SwitchMode(value);
            }
    }

}

更新

有一些我应该提到的 javascript 错误。 Firebug 报告 AG_E_PARSER_BAD_PROPERTY_VALUE 异常。我的数据绑定似乎还没有工作。

【问题讨论】:

  • IsBookmarked 是作为依赖属性实现的?此外,您的代码有点令人困惑,您向我们展示了一个名为 Bookmark 的部分类,它具有 IsSiteBoolmarked 属性,但您的 Xaml 正在分配给 IsBookmarked 属性。 IsSiteBookmarked 属性实际上似乎是一个名为Employee 的类的属性。我认为您需要整理一下这个问题并添加更多细节。
  • 添加了更多信息。希望对您有所帮助。

标签: silverlight data-binding datacontext


【解决方案1】:

将 Bookmark 控件上的 IsBookmarked 属性设为依赖属性。

我认为 Control_Loaded 是您的 FormControl 的一部分,在这种情况下,我不确定您是否正确使用了 DataContext。最好仔细检查一下。

更新:是的,您正确使用了 DataContext。 AG_E_PARSER_BAD_PROPERTY_VALUE 表示您需要将 IsBookmarked 属性设为依赖属性,如下所示:

 Public Property IsBookmarked() As Boolean
    Get
        Return Me.GetValue(IsBookmarkedProperty)
    End Get
    Set(ByVal value As Boolean)
        Me.SetValue(IsBookmarkedProperty, value)
    End Set
End Property

Public Shared ReadOnly IsBookmarkedProperty As DependencyProperty = DependencyProperty.Register("IsBookmarked", GetType(Boolean), GetType(Bookmark), New PropertyMetadata(New PropertyChangedCallback(AddressOf OnIsBookmarkedPropertyChanged)))

Private Shared Sub OnIsBookmarkedPropertyChanged(ByVal d As DependencyObject, ByVal e As DependencyPropertyChangedEventArgs)
    Dim cntrl As Bookmark = TryCast(d, Bookmark)
    cntrl.SetIsBookmarked(e.NewValue)
End Sub

如果您只需要存储值以供以后使用,那么您不需要在 OnIsBookmarkedPropertyChanged 过程中做任何事情,但我还是放了一些代码作为示例。

祝你好运!

【讨论】:

  • 看起来使用 DependencyProperty 解决了这个问题。不再有 BAD_PROPERTY 解析问题。我仍然想知道为什么 Silverlight 需要 DependencyProperty 才能工作。至少,应该抛出一个编译时错误。感谢您的帖子和示例。
【解决方案2】:

该控件公开了一个IsSiteBookmarked 属性(我认为它应该是一个DependencyProperty),但该控件绑定到一个未显示的IsBookmarked。这是故意的吗?您是否检查了 Visual Studio 输出窗口是否存在绑定错误?

加法1: 由于您已修复问题中的错字并补充说有错误被报告。

首先解决 AG_E_PARSER_BAD_PROPERTY_VALUE 问题。错误信息中是否有行号和起始位置?开始看那里。一种策略是开始取出 XAML,直到不再出现错误。这将缩小违规代码的范围。

在调试模式下运行,在输出窗口中检查绑定错误。

您可能还想发布 Employee 类代码,尤其是 IsSiteBookmarked 属性。

【讨论】:

    【解决方案3】:

    我不记得评估数据绑定的确切顺序(我懒得去查找它),但我记得,它最初发生在表单的 Loaded 事件触发之前,并且没有设置 IsBookmarked property 一个依赖属性,或者至少使用 INotifyPropertyChanged,它可能无法正确建立数据上下文。我建议要么实现 INotifyPropertyChanged 要么使 IsBookmarked 成为依赖属性。 DataBinding 足够艰难,可以在最好的情况下正确处理(请参阅我关于它的长篇大论、脾气暴躁的咆哮 here),如果您没有在它期望的方式。

    【讨论】:

      【解决方案4】:

      通常在对对象进行数据绑定时,您会希望利用 INotifyPropertyChanged 接口并实现该接口,以便控件可以正确地使其属性值无效。除非您将 INotifyPropertyChanged 与 Mode=TwoWay 一起使用,否则任何更改 DataContext 的 IsSiteBookmarked 的代码都将无效。

      【讨论】:

      • 一次一步。我想首先让数据绑定工作,然后我会担心属性的通知/更新。
      猜你喜欢
      • 2010-11-24
      • 2011-01-27
      • 2016-05-30
      • 2011-07-14
      • 1970-01-01
      • 2011-01-25
      • 2011-11-28
      • 2018-11-14
      • 1970-01-01
      相关资源
      最近更新 更多