【发布时间】:2011-05-03 09:48:34
【问题描述】:
我想创建一个用户控件,它可以绑定到控件外部给出的一些数据(要求 A),并且一些 XAML 属性必须绑定到控件本身的属性(要求 B)。
假设我有一个名为 StudentData 的数据类和一个名为 StudentControl 的控件。我在 DataGrid 中使用这个控件。我将 StudentControl 放入带有 DataGridTemplateColumn 的网格中。我以某种方式将当前单元格中的 StudentData 绑定到控件。这是要求 A。此 StudentControl 想要指定其中的某些控件是否可编辑。最好的方法是公开一个属性,例如 StudentControl.AreSomeControlsEditable。然后我可以将这些控件的 IsEnabled 属性绑定到该属性。这是要求 B。
这是我的第一个想法。我将当前 StudentData 绑定到 StudentControl 的 DP,然后,在 StudentControl 内部,我将数据上下文更改为控件本身:
<UserControl DataContext="{Binding RelativeSource={RelativeSource Self}}">
<TextBox
Content="{Binding Path=ExposedStudentData.Field1}" *reqA*
IsEnabled="{Binding Path=OtherProperty1}" /> *reqB*
</UserControl>
这样,我想,StudentControl 从外部获取 StudentData,公开相同的 StudentData 和其他新属性(因此数据和其他属性现在在一个地方,而不是两个),然后我可以绑定到这些XAML 中公开的属性(同时满足 reqA+reqB)。除非这因为this bug 而不起作用。基本上,如果我将控件的 DataContext 设置为自身,那么它会在应用外部绑定之前设置。因此,如果我在单元格内的绑定路径是 X,然后数据上下文发生变化,则绑定引擎将在新的自身数据上下文中查找 X,而不是在外部网格数据上下文中。
这是我的第二个想法。我将当前的 StudentData 绑定到 DataContext 或 StudentControl 的 DP。然后,为了访问 StudentControl 的其他公开属性,我为 UserControl 命名并使用 ElementName 绑定:
<UserControl x:Name="self">
<TextBox
Content="{Binding Path=Field1}" *reqA*
IsEnabled="{Binding ElementName=self, Path=OtherProperty1" /> *reqB*
</UserControl>
这样,我想,当前的数据上下文是 StudentData,它没有改变,我可以用一个简单的路径 (reqA) 绑定到它,我可以用 ElementName 东西绑定到其他公开的属性 (要求B)。由于this bug,它适用于基本场景,但不适用于DataGrid。我猜当视觉树中有多个具有相同名称的控件时会出现问题。
我真的开始讨厌 Silverlight,我一个月前开始使用它,我已经报告了 9 个错误。每当我尝试实现除了简单的 hello world 应用程序或 Microsoft 和其他所有人似乎都在使用 Silverlight 的东西之外的东西时,我都会遇到一个新错误。那么现在,您将如何绑定到从控件外部提供的数据类以及同时由控件公开的一些其他属性?当然,无需从代码设置绑定(其中我现在正在做,但它是 ListBoxes 和 DataTemplates 的噩梦)或根本不使用绑定。
【问题讨论】:
标签: data-binding silverlight-4.0