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の「名前」、列「テスト」、最初の行にバインドしようとしています。

しかし、私はそれを正しく理解できません。DataGrid の外でも問題なくバインドできることに注意してください。グリッドの 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では機能しないことに注意してください。「FindAncestor、AncestorType」のものはまだSilverlightに実装されていません...静的リソースを使用する以外に、別のメソッドがあるかどうかはわかりません。

于 2010-12-15T13:09:26.787 に答える
0

これは実際に予想される動作ですDataContex。t forDataGridCellは、wholeRow です。

したがって、3 つの解決策があります。次のように、コード ビハインドにバインディングを追加します。

各列のコンストラクターで:

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

(「thisColumnIndex」を取得する方法を見つける必要があります。私に関する限り、列を作成した直後に列を追加します。そこに「dataGridOwner.Columns.Count」を配置するだけです)。

また...

各セルで必要なdataContextを取得する方法を見つけることができます(それを試しましたが、列/行の仮想化がオンになっているとひどく混乱します)

また...

そこを見てください:

セル オブジェクトのプロパティを WPF DataGrid の DataGridCell にバインドする

個人的には、私の目的には最初のものの方が優れていると思います(とにかくコードビハインドに列を追加するため)が、これは最終的にはあなた次第です...


columnHeaders に関する限り (行ではなく、columnHeaders のみ)、「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 属性を与えます (例: Name=ZeWindow)。DataGridTextBoxColumn2)ヘッダーを次のようにバインドします。

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

DataContext基本的に、のにバインドする代わりに、Name=ZeWindow を使用しての にDataGridバインドします。DataContextUIElement

PS: 私は WPF を初めて使用するので、これは Window では機能しない可能性がありますが、UserControls を使用して同様のことを行いました

于 2010-10-13T11:02:28.047 に答える