11

我有一个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>

基本上,我正在尝试将该列的标题绑定到 DataTable “Names”,Column “Test”,第一行。

但是,我无法正确处理。请注意,我可以在 DataGrid 之外很好地绑定它。Grid 的 ItemsSource 更改了数据上下文,我不知道如何在外部引用原始 DataContext。

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

如果我将 DataSet 设为静态并通过 {x:Static local:dataset} 访问它,那么一切正常。但我不能使用静态数据集,因为会有多个实例(多用户)。

谁能指出我正确的方向?

4

3 回答 3

18

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>

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

它允许您绑定到父窗口,在我的例子中,它具有视图模型作为数据上下文(带有SomethingOutsideDataContext 属性)。

不过,您应该知道,这仅适用于 WPF 而不是 Silverlight - Silverlight 中尚未实现“FindAncestor,AncestorType”的东西......我不确定除了使用静态资源之外是否还有另一种方法。

于 2010-12-15T13:09:26.787 回答
0

这实际上是预期的行为:DataContextDataGridCell是整个行。

所以你有3个解决方案:或者你在代码中添加你的绑定,如下所示:

在每个列的构造函数中:

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

(你必须找到一种方法来获取“thisColumnIndex”。就我而言,我在创建它们之后立即添加列,我只是将“dataGridOwner.Columns.Count”放在那里)。

或者...

您可以找到一种在每个单元格上获取所需数据上下文的方法(尝试过,但在启用列/行虚拟化时会严重混乱)

或者...

看看那里:

将单元格对象的属性绑定到 WPF DataGrid 中的 DataGridCell

我个人认为第一个更适合我的目的(因为无论如何我在代码中添加了我的列),但这最终取决于你......


就 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”类包含此处引用的所有属性的定义。

希望这可以帮助。

于 2011-02-04T08:00:43.363 回答
0

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

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

所以基本上,不是绑定到 的 ,而是DataContext绑定DataGrid到Name=ZeWindowDataContext的。UIElement

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

于 2010-10-13T11:02:28.047 回答