绑定到当前ItemsSource上下文之外的DataContext

vud*_*duy 8 data-binding wpf datagrid relativesource itemssource

DataSet有义务Window.DataContext; 我还有一个DataGrid:

<DataGrid ItemsSource={Binding Tables[Items]}>
    <DataGrid.Columns>
        <DataGridTextBoxColumn Header={Binding Path=DataContext.Tables[Names]/Test, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}} />
    </DataGrid.Columns>
</DataGrid>
Run Code Online (Sandbox Code Playgroud)

基本上,我正在尝试将该列的Header绑定到DataTable"Names",列"Test",第一行.

但是,我无法做到对.请注意,我可以在DataGrid外部绑定它.Grid的ItemsSource更改了数据上下文,我不知道如何在外部引用原始DataContext.

似乎绑定成功了; 但问题是Window.DataContext中Tables [Names]的当前项(第一行)丢失了.

如果我使DataSet静态并通过{x:Static local:dataset}访问它,那么事情就可以了.但我不能使用静态数据集,因为会有多个实例(多用户).

有谁能指出我正确的方向?

小智 13

我很确定你可以通过使用RelativeSource绑定来做你想做的事情.

<DataGrid ItemsSource="{Binding StringCollection}" 
          AutoGenerateColumns="False">
  <DataGrid.Columns>
    <DataGridTextColumn Binding="{Binding}" />
    <DataGridTextColumn Binding="{
                          Binding RelativeSource={
                            RelativeSource FindAncestor, 
                            AncestorType={x:Type Window}},
                          Path=DataContext.SomethingOutsideDataContext}" />
  </DataGrid.Columns>
</DataGrid>
Run Code Online (Sandbox Code Playgroud)

我在http://bitbucket.org/claus/wpf-bindingoutsidedatacontext上做了一个简单的例子.

它允许您绑定到父窗口,在我的情况下,它将viewmodel作为datacontext(上面有SomethingOutsideDataContext属性).

你应该知道,这只适用于WPF而不是Silverlight - "FindAncestor,AncestorType"的东西还没有在Silverlight中实现......我不确定是否还有其他方法,除了使用静态资源.

  • 当我做这件事时(但我绑定了`Visibility`),我得到:`System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.DockPanel ', AncestorLevel='1''。BindingExpression:Path=DataContext.IsFileMode; 数据项=空;目标元素是“DataGridTextColumn”(HashCode=16991479);目标属性是“可见性”(类型“可见性”)`。目前我使用 CodeBehind 处理这个问题。 (2认同)

Gil*_*zzi 0

不知道这是否适合您的情况,但您可以尝试这样的操作: 1)为您的窗口指定一个名称属性,例如 Name=ZeWindow。2)DataGridTextBoxColumn像这样绑定你的标题:

<DataGridTextBoxColumn Header="{Binding Path=DataContext.Tables[Names]/Text, ElementName=ZeWindow}"/>
Run Code Online (Sandbox Code Playgroud)

所以基本上,您不是绑定到 的DataContext,而是绑定到 Name=ZeWindow的。DataGridDataContextUIElement

PS:我对 WPF 还很陌生,所以这可能不适用于 Window,但我使用 UserControls 做了类似的事情