WPF绑定到父DataContext

我们有一个标准的MVVM模式的WPF应用程序,利用视图 – > ViewModel分辨率的Cinch(因此MefedMVVM)。 这效果很好,我可以将相关的控件绑定到ViewModel上的属性。

在特定的视图中,我们有一个Infragistics XamGrid。 此网格绑定到ViewModel上的ObservableCollection,并显示相应的行。 然而,然后我在这个网格上有一个特定的列,我试图将一个TextBox文本值绑定到父DataContext,而不是ObservableCollection属性。 此绑定失败。

我们已经通过了几个选项,其中包括:

  1. 使用AncestorType来跟踪树,并绑定到父UserControl的DataContext像这样(从这个问题,以及这一个 伟大的答案 )…

    {Binding Path=PathToProperty, RelativeSource={RelativeSource AncestorType={x:Type typeOfAncestor}}} 
  2. 指定ElementName并尝试直接定位顶层控件。 看看这里,如果你想阅读关于使用ElementName。

  3. 使用在UserControl的资源中定义的“代理”FrameorkElement,根据需要尝试“传入”上下文。 我们将元素定义如下,然后引用为静态资源…

     <FrameworkElement x:Key="ProxyContext" DataContext="{Binding Path=DataContext, RelativeSource={RelativeSource Self}}"></FrameworkElement> 

在这种情况下,绑定findFrameworkElement,但不能访问超出的内容(当指定Path时)。

经过阅读,看起来很有可能是由Infragistics XamGrid构build列的外部树引起的。 但是,即使是这样的情况下,至less选项2或3应该工作。

我们最后的想法是它与V-VM绑定有关,但即使使用Snoop,我们仍然没有find确切的问题。 我绝不是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打开了,你只需要添加你想要的列,然后closures相关的标签。

我不知道XamGrid但这是我会做一个标准的WPF DataGrid

 <DataGrid> <DataGrid.Columns> <DataGridTemplateColumn> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBlock Text="{Binding DataContext.MyProperty, RelativeSource={RelativeSource AncestorType=MyUserControl}}"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> <DataGridTemplateColumn.CellEditingTemplate> <DataTemplate> <TextBox Text="{Binding DataContext.MyProperty, RelativeSource={RelativeSource AncestorType=MyUserControl}}"/> </DataTemplate> </DataGridTemplateColumn.CellEditingTemplate> </DataGridTemplateColumn> </DataGrid.Columns> </DataGrid> 

由于单元格模板中指定的TextBlockTextBox将成为可视化树的一部分,因此您可以逐步查找所需的任何控件。

因为这样的事情,根据一般的经验,我尽量避免XAML的“欺骗”,并尽可能保持XAML的愚蠢和简单,并在ViewModel(或附加属性或IValueConverters等)中做其余的事情。如果真的有必要)。

如果可能的话,我会给当前的DataContext的ViewModel一个参考(即属性)的相关的父ViewModel

 public class ThisViewModel : ViewModelBase { TypeOfAncestorViewModel Parent { get; set; } } 

并直接绑定反而。

<TextBox Text="{Binding Parent}" />