我正在使用WPF,.NET 3.5 Framework。
我有一个TabItem,其DataContext为'Request',一个自定义对象。 “请求”有一个名为“Id”的属性。
TabItem的内容是一个包含DataGrid的用户控件(它继承了DataContext,没有?)。 DataGrid显示一组'Request'对象,其中一个对象是与用户控件的DataContext相同的'Request'实例。
我正在尝试传递当前行的“Id”属性以及用户控件的DataContext的“Id”来比较它们。
我已将我的用户控件命名为(x:Name =“myRoot”)。这是绑定的xaml。请记住,这都位于“DataGridTemplateColumn”中:
<Image x:Name="imgOpen" Source="open.ico" Width="10" Height="10">
<Image.Visibility>
<MultiBinding Converter="{StaticResource IsLinkedRequest}">
<Binding Path="Id" />
<Binding Path="DataContext.Id" ElementName="myRoot" />
</MultiBinding>
</Image.Visibility>
</Image>
这是转换器:
Dim datagridRecordId As Integer = CInt(values(0))
Dim currentReqId As Integer = CInt(values(1))
If currentReqId <> datagridRecordId Then
Return Visibility.Visible
Else
Return Visibility.Hidden
End If
我的问题是DataContext.Id绑定(转换器中的values(1))的值始终为MS.Internal.NamedObject。如果我尝试直接绑定到DataContext(Path =“DataContext”ElementName =“myRoot”)或者甚至只是尝试绑定到公共属性(Path =“MyProperty”ElementName =“myRoot”)并不重要用户控件本身,值是ALWAYS MS.Internal.NamedObject。
这是DataGrid的问题吗? MultiValueConverter中的错误?或者我在这里做错了什么?
非常感谢任何帮助!
谢谢,
戴夫
答案 0 :(得分:0)
如果您的图像位于DataTemplate中,那么它与其他所有内容不同name scope。因此,您无法在DataTemplate中按名称绑定到DataTemplate之外的元素。
您必须使用RelativeSource之类的内容,或者将您需要的信息传递到DataTemplate(通过它的DataContext)。
您获得的NamedObject可能是BindingExpression.NullDataItem(您可以在其上调用ToString()来验证)。但这有效地说它无法找到有问题的元素。