2010-10-13 67 views
7

我有一个DataSet绑定到Window.DataContext;我也有一个DataGrid绑定到DataContext外部当前ItemsSource上下文

<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> 

基本上,我想这列数据表“名称”,列“试验”,第一行的标题绑定。

但是,我不明白。请注意,我可以在DataGrid外部很好地绑定它。 Grid的ItemsSource更改数据上下文,我不知道如何将外部引用到原始DataContext。

看来绑定成功了;但问题在于Window.DataContext中的Tables [Names]的当前项(第一行)丢失了。

如果我让DataSet是静态的并通过{x:Static local:dataset}来访问它,那么事情就会正常工作。但是我不能使用静态数据集,因为会有多个实例(多用户)。

任何人都可以请指出我在正确的方向吗?

回答

0

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

<DataGridTextBoxColumn Header="{Binding Path=DataContext.Tables[Names]/Text, ElementName=ZeWindow}"/> 

所以基本上,而不是绑定到DataGridDataContext,绑定到UIElementDataContext与名称= ZeWindow。

PS:我很新的WPF,所以这可能不是与窗口工作,但我使用用户控件

+0

我也试过这个。它在我的文章中给出了与FindAncestor方法相同的结果。即:它成功绑定,但原始DataContext的“CurrentItem”丢失了。我的问题的罪魁祸首是,我试图引用另一个具有自己的CurrentItem(行[0])的DataTable;如果我只提到一个简单的属性,那么你的方法以及FindAncestor都可以正常工作。 – vuduy 2010-10-13 13:51:10

+0

好吧,我看到了,然后我很抱歉,但我不知道可能是什么问题。希望别人知道 – 2010-10-13 14:47:39

10

我敢肯定,你可以做你试图做什么没有类似的东西使用RelativeSource进行绑定。 http://bitbucket.org/claus/wpf-bindingoutsidedatacontext

它可以让你绑定到父窗口,这在我的情况下,具有视图模型作为DataContext的(与它的SomethingOutsideDataContext属性):

<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> 

我在做一个简单的例子。

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

+0

如果它不适合你,请添加一个你正试图绑定的Tables [Items]/Tables [Names]对象结构的例子,我会看看我是否可以使用它创建一个示例... – Claus 2010-12-15 13:25:47

+0

还要确保您的祖先类型是'Window'的类型,而不是'UserControl'的类型,因为'DataContext'属性会出现'null' – Kitson88 2018-02-27 09:42:35

0

这实际上是预期的行为:DataGridCellDataContex t是整个行数。

所以你有3个解决方案: 要么你把你的代码背后的结合是这样的:

中的每一列的构造

string source = String.Format(CultureInfo.InvariantCulture, "[{0}].", thisColumnIndex); 
base.Binding = new Binding(source + "Text"); 

(你必须找到一种方式来获得的“thisColumnIndex “就我而言,我在创建它们之后立即添加这些列,我简单地将”dataGridOwner.Columns.Count“放在那里)。

or ...

你可以找到一个办法让你想对每一个电池在DataContext(试过,但它搅乱涨得厉害时,行/列虚拟化是上)

或...

看看有:

Binding a cell object's property to a DataGridCell in WPF DataGrid

我个人觉得第一个是我的目的,更好的(因为我在后面反正代码添加我的专栏),但是这是真的取决于你到底...


至于columnHeaders而言(只有columnsHeaders,不是行),你也可以探索“的DataTemplate”的方式:

设置列标题的向列本身(您设置的这种方式列作为DataContext的标题)并使用DataTemplate。

如:

private static DependencyProperty ColumnHeaderProperty = DependencyProperty.Register("ColumnHeader", typeof(MyDataGridColumnHeader), typeof(MyTextBoxColumn)); 
public MyDataGridColumnHeader ColumnHeader 
{ 
    get { return (MyDataGridColumnHeader)(GetValue(ColumnHeaderProperty)); } 
    set { SetValue(ColumnHeaderProperty, value); } 
} 

this.ColumnHeader = new MyDataGridColumnHeader(); 
Header = this; 

,并在你的DataGrid的XAML,像:

<DataGrid.ColumnHeaderStyle> 
    <Style TargetType="{x:Type DataGridColumnHeader}"> 
     <Style.Setters> 
      <Setter Property="HorizontalContentAlignment" Value="Stretch"/> 
      <Setter Property="VerticalContentAlignment" Value="Stretch"/> 
      <Setter Property="BorderThickness" Value="{Binding BorderThickness}" /> 
      <Setter Property="BorderBrush" Value="{StaticResource DataGridLinesBrush}" /> 
      <Setter Property="Background" Value="{StaticResource DataGridColumnHeaderBackground}" /> 

      <Setter Property="FontFamily" Value="{Binding ColumnHeader.Font.Family, TargetNullValue={StaticResource DefaultFontFamily}}" /> 
      <Setter Property="FontSize" Value="{Binding ColumnHeader.Font.Size, TargetNullValue={StaticResource DefaultFontSize}}" /> 
      <Setter Property="FontStyle" Value="{Binding ColumnHeader.Font.Style, TargetNullValue=Normal}" /> 
      <Setter Property="FontWeight" Value="{Binding ColumnHeader.Font.Weight, TargetNullValue=Bold}" /> 
      <Setter Property="Foreground" Value="{Binding ColumnHeader.Font.Brush, TargetNullValue={StaticResource DataGridColumnHeaderForeground}}" /> 

      <Setter Property="ContentTemplate"> 
       <Setter.Value> 
        <DataTemplate> 
         <Grid Background="{Binding ColumnHeader.Background}"> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition Width="Auto" /> 
           <ColumnDefinition Width="*" /> 
           <ColumnDefinition Width="Auto" /> 
          </Grid.ColumnDefinitions> 
          <Image Name="LeftImage" Grid.Column="0" Stretch="None" Margin="3, 0, 0, 0" Source="{Binding ColumnHeader.LeftImage}" VerticalAlignment="Center"/> 
          <Image Name="RightImage" Grid.Column="2" Stretch="None" Margin="0, 0, 5, 0" Source="{Binding ColumnHeader.RightImage}" VerticalAlignment="Center"/> 
          <TextBlock Name="HeaderText" 
             Grid.Column="1" 
             VerticalAlignment="Center" 
             HorizontalAlignment="Center" 
             TextDecorations="{Binding ColumnHeader.Font.Decorations}" 
             Text="{Binding ColumnHeader.Text}" /> 
         </Grid> 
        </DataTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style.Setters> 
    </Style> 
</DataGrid.ColumnHeaderStyle> 
当然

,我的 “MyDataGridColumnHeader” 类包含了所有的定义

在每列类

这里引用的属性。

希望这有助于。

相关问题