我们有一个WPF应用程序,使用标准的MVVM模式,利用Cinch(因此使用MefedMVVM)进行View->ViewModel解析。这很有效,我可以将相关控件绑定到ViewModel上的属性。
在特定的视图中,我们有一个Infragistics XamGrid。该网格绑定到ViewModel上的ObservableCollection,并显示相应的行。但是,我需要将此网格上的特定列的TextBox文本值绑定到父DataContext上的属性,而不是ObservableCollection上的属性。此绑定失败了。
我们尝试了几种选项,包括:
使用AncestorType跟踪上树并绑定到父UserControl的DataContext,如下所示(来自于这个问题的大回答和这个问题的回答)...
{Binding Path=PathToProperty, RelativeSource={RelativeSource AncestorType={x:Type typeOfAncestor}}}
如果要指定ElementName并且直接针对顶层控件进行操作,请查看此处了解如何使用ElementName。
使用在UserControl资源中定义的“代理”FrameworkElement来尝试按需传递上下文。我们按如下所示定义该元素,然后作为静态资源引用...
<FrameworkElement x:Key="ProxyContext" DataContext="{Binding Path=DataContext, RelativeSource={RelativeSource Self}}"></FrameworkElement>
在这种情况下,绑定找到了FrameworkElement,但是无法访问超出其范围的任何内容(当指定路径时)。
经过阅读,看起来很可能是Infragistics XamGrid在树之外构建列导致的。然而,即使是这种情况,至少选项2或3应该可行。
我们最后的想法是它与V-VM绑定有关,但即使使用Snoop,我们仍然无法找到确切的问题所在。我对WPF绑定并不是专家,因此任何指针都将不胜感激。
编辑:我在Infragistics的这里找到了一些模板示例,我将尝试一下。
编辑2:正如@Dtex指出的那样,模板是正确的选择。以下是用于XamGrid的相关代码片段:
<ig:GroupColumn Key="CurrentDate">
<ig:GroupColumn.HeaderTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=DataContext.CurrentDateTest, RelativeSource={RelativeSource AncestorType=UserControl}}" />
</DataTemplate>
</ig:GroupColumn.HeaderTemplate>
<ig:GroupColumn.Columns>
我已经将XML保留了开放状态...你只需要添加你想要的列,然后关闭相关的标签即可。
DataContext
。这会破坏消费者的使用体验! - Dan Puzey