Silverlight中的DataContext,DataBinding和Element Binding

时间:2010-03-23 04:10:57

标签: silverlight data-binding datacontext

我有一段时间试图让我的数据绑定正常工作。我有理由相信我想要完成的事情无法完成,但我们会看到我得到的答案。

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

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

这是我的控件的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异常。我的数据绑定似乎还没有工作。

4 个答案:

答案 0 :(得分: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过程中执行任何操作,但我还是将一些代码放在那里作为示例。

祝你好运!

答案 1 :(得分:1)

我不记得评估数据绑定的确切顺序(而且我懒得去查找它),但我记得,它最初发生在表单的Loaded事件触发之前,并且没有使用IsBookmarked属性是依赖属性,或者至少使用INotifyPropertyChanged,它可能无法正确建立datacontext。我建议实现INotifyPropertyChanged或使IsBookmarked成为依赖属性。 DataBinding非常强大,可以在最好的情况下做到正确(看到我对它的长期,脾气暴躁的咆哮here),如果你没有设置你的话,你只会让自己变得更加困难属性以预期的方式。

答案 2 :(得分:1)

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

加法1: 由于您已在问题中修正了拼写错误并添加了报告错误。

首先清除AG_E_PARSER_BAD_PROPERTY_VALUE问题。错误消息中是否有行号和起始位置?开始寻找那里。一种策略是开始取出XAML,直到不再出现错误。这将缩小有问题的代码。

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

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

答案 3 :(得分:0)

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