2010-03-23 67 views
2

我有一段时间试图让我的数据绑定正常工作。我有理由相信我想要完成的事情不能完成,但我们会看到我得到的答案。Silverlight中的DataContext,DataBinding和元素绑定

我有一个UserControl。这个用户控件只包含一个按钮。现在在后面的代码中,我有一个属性名称IsBookmarked。当设置了IsBookmarked时,会运行代码来激活按钮的外观。这个想法是,你点击按钮,它在视觉上改变。我们将调用这个UserControl一个书签控件。

现在我有另一个控件,我们将调用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); 
      } 
    } 

} 

UPDATE

明白了,我应该提一些JavaScript错误。 Firebug报告了一个AG_E_PARSER_BAD_PROPERTY_VALUE异常。这似乎并不像我的数据绑定甚至还在工作。

+1

'IsBookmarked'是作为依赖项属性实现的吗?另外你的代码有点混乱,你向我们展示一个叫做Bookmark的分类,它有一个IsSiteBoolmarked属性,但你的Xaml分配给一个IsBookmarked属性。 IsSiteBookmarked属性实际上似乎是一个名为Employee的类的属性。我认为你需要整理这个问题并添加更多的细节。 – AnthonyWJones 2010-03-23 12:17:37

+0

添加了更多信息。希望能帮助到你。 – Matt 2010-03-23 16:01:24

回答

1

让您IsBookmarked财产上的书签控制依赖项属性。

我相信Control_Loaded是你FormControl的一部分,在这种情况下,我不知道你是否正确使用的DataContext。最好仔细检查一下。

UPDATE:是的,你是正确使用的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程序什么,但无论如何,我都会在此处添加一些代码。

祝你好运!

+0

看起来像使用DependencyProperty修复了这个问题。没有更多的BAD_PROPERTY解析问题。我仍然想知道为什么Silverlight需要一个DependencyProperty来工作。至少应该抛出编译时错误。感谢帖子和样本。 – Matt 2010-03-24 15:08:09

0

通常在做数据绑定到一个对象时,你会希望利用INotifyPropertyChanged接口和实施,使得控制能够正确无效它的属性值。除非你使用INotifyPropertyChanged的使用模式=双向然后改变你的DataContext的IsSiteBookmarked不会有任何效果的任何代码。

+0

一步一个脚印。我想首先让数据绑定工作,然后我会担心该属性的通知/更新。 – Matt 2010-03-23 04:48:32

1

我不记得数据绑定评估的确切顺序(我懒得去查看它),但我记得,它最初发生在窗体的Loaded事件触发之前,并且没有IsBookmarked属性是一个依赖属性,或者至少使用INotifyPropertyChanged,它可能会在适当地建立datacontext时遇到问题。我建议要么实施INotifyPropertyChanged或使IsBookmarked一个依赖属性。DataBinding足够强大,可以在最好的情况下正确使用(请参阅我的长篇大论,但是脾气暴躁)here),如果您不是以某种方式设置属性,那么您只会让自己更加困难它期望的。

1

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

加法1: 由于您已修复了您的问题中的拼写错误,并补充说明存在错误报告。

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

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

您可能还想要发布Employee类代码,特别是IsSiteBookmarked属性。

+0

我的不好,我有一个错字。我更新了这个问题。 – Matt 2010-03-23 16:49:02