我有一段时间试图让我的数据绑定正常工作。我有理由相信我想要完成的事情无法完成,但我们会看到我得到的答案。
我有一个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异常。我的数据绑定似乎还没有工作。
答案 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的代码都将无效。