Silverlight中的DataContext、数据绑定和元素绑定

Silverlight中的DataContext、数据绑定和元素绑定,silverlight,data-binding,datacontext,Silverlight,Data Binding,Datacontext,为了让我的数据绑定正常工作,我经历了一段痛苦的时光。我有理由相信我正在努力完成的事情是做不到的,但我们会看看我得到了什么答案 我有一个用户控件。此UserControl只包含一个按钮。现在在代码背后,我有一个属性名IsBookmarked。设置IsBookmarked后,将运行用于设置按钮外观动画的代码。这个想法是,你点击按钮,它会在视觉上发生变化。我们将此UserControl称为书签控件 现在我有了另一个控件,我们称之为FormControl。My FormControl包含一个子书签控件。

为了让我的数据绑定正常工作,我经历了一段痛苦的时光。我有理由相信我正在努力完成的事情是做不到的,但我们会看看我得到了什么答案

我有一个用户控件。此UserControl只包含一个按钮。现在在代码背后,我有一个属性名IsBookmarked。设置IsBookmarked后,将运行用于设置按钮外观动画的代码。这个想法是,你点击按钮,它会在视觉上发生变化。我们将此UserControl称为书签控件

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

这是我的控件的XAML和已加载的事件处理程序。如您所见,它包含一个子元素,该子元素是一个自定义控件(书签)。因此,一旦加载此控件,它的DataContext将设置为Employee对象的新实例。Silverlight还将my child bookmark控件的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 };

}
更新


我应该提到一些javascript错误。Firebug报告AG_E_解析器_BAD_属性_值异常。我的数据绑定似乎还没有开始工作。

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

将书签控件上的IsBookmarked属性设置为依赖项属性

我假设加载的控件是FormControl的一部分,在这种情况下,我不确定您是否正确使用了DataContext。最好再检查一下

更新:是的,您正确地使用了DataContext。AG_E_PARSER_BAD_PROPERTY_值表示需要将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过程中执行任何操作,但我还是在其中添加了一些代码作为示例


祝你好运

我不记得对数据绑定求值的确切顺序(我懒得去查找),但我记得,它最初发生在窗体的加载事件触发之前,并且没有将IsBookmarked属性作为依赖属性,或者至少使用INotifyPropertyChanged,它可能无法正确地建立datacontext。我建议要么实现INotifyPropertyChanged,要么将IsBookmarked设置为依赖项属性。数据绑定很难在最好的情况下正确进行(请参阅我对它的长篇大论),如果您没有按预期的方式设置属性,您只会让自己变得更加困难。

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

添加1: 因为您已修复了问题中的打字错误,并补充说报告了一个错误

首先解决AG_E_解析器_BAD_PROPERTY_值问题。错误消息中是否有行号和开始位置?开始查找。一种策略是开始删除XAML,直到不再出现错误。这将缩小出错代码的范围

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


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

一步一个脚印。我想先让数据绑定开始工作,然后再担心属性的通知/更新。
IsBookmarked
是作为依赖属性实现的?而且您的代码有点混乱,请向我们展示一个名为
Bookmark
的部分类有一个
issiteboolkmarked
属性,但是您的Xaml正在分配给一个
IsBookmarked
属性。
IsSiteBookmarked
属性实际上似乎是名为
Employee
的类的属性。我认为您需要整理这个问题并添加一点detail.添加了更多信息。希望有帮助。看起来使用DependencyProperty解决了这个问题。不再有坏的属性解析问题。我仍然想知道为什么Silverlight需要DependencyProperty才能工作。至少,应该抛出编译时错误。感谢您的帖子和示例。
 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