13

2つのWPFツールキットがDataGridsあります。ユーザーが最初のグリッドの最初の列のサイズを変更すると、2番目のグリッドの最初の列のサイズが変更されるようにします。2番目のグリッドの幅を最初のグリッドの適切な列にバインドしようとしましたDataGridColumnが、機能しません。すべてのxamlを使用したいのですが、コードビハインドを使用しても問題ありません。

<tk:DataGrid Width="100" Height="100">
    <tk:DataGrid.Columns>
        <tk:DataGridTextColumn x:Name="Column1" Width="50"/>
    </tk:DataGrid.Columns>
</tk:DataGrid>
<tk:DataGrid Width="100" Height="100">
    <tk:DataGrid.Columns>
        <tk:DataGridTextColumn x:Name="Column1Copy" Width="{Binding Path=ActualWidth, ElementName=Column1}"/>
    </tk:DataGrid.Columns>
</tk:DataGrid>

Widthの代わりににバインドしようとしましActualWidthたが、どちらも機能しません。

どんな助けでも大歓迎です。

4

6 に答える 6

14

まあ、ストレートXAMLを使用することは可能ではないと思いますが、DataGridColumnから派生しているので、それでもそうすべきだと思いDependencyObjectます。私はそれをプログラムで行う方法を見つけました。私はそれについてわくわくしていませんが、それは機能します:

DataGridColumn.WidthProperty.AddValueChanged(upperCol, delegate
{
    if (changing) return;
    changing = true;
    mainCol.Width = upperCol.Width;
    changing = false;
});
DataGridColumn.WidthProperty.AddValueChanged(mainCol, delegate 
{ 
    if (changing) return;
    changing = true;
    upperCol.Width = mainCol.Width; 
    changing = false; 
});

public static void AddValueChanged(this DependencyProperty property, object sourceObject, EventHandler handler)
{
    DependencyPropertyDescriptor dpd = DependencyPropertyDescriptor.FromProperty(property, property.OwnerType);
    dpd.AddValueChanged(sourceObject, handler);
}
于 2009-01-12T16:58:05.820 に答える
6

メソッドを使用してDataGrid LayoutUpdated、列幅に関する他のオブジェクトを操作できます。

private void dataGrid1_LayoutUpdated(object sender, EventArgs e)
{
    for(int i = 0 ; i < dataGrid1.Columns.Count && i < dataGrid2.Columns.Count ; ++i)
        dataGrid2.Columns[i].Width = dataGrid1.Columns[i].ActualWidth;
}
于 2011-11-27T04:10:16.753 に答える
1

私はこれを試しました:

<tk:DataGrid Width="100" Height="100" x:Name="Grid1" Grid.Column="0">
   <tk:DataGrid.Columns>
      <tk:DataGridTextColumn x:Name="Column1" Width="50"/>
   </tk:DataGrid.Columns>
</tk:DataGrid>
<tk:DataGrid Width="100" Height="100" x:Name="Grid2" Grid.Column="1">
   <tk:DataGrid.Columns>
     <tk:DataGridTextColumn x:Name="Column1Copy" Width="{Binding Mode=TwoWay, Path=Columns[0].ActualWidth, ElementName=Grid1}"/>
     </tk:DataGrid.Columns>
</tk:DataGrid>

ただし、DataGridColumnsはから派生するのではなくFrameworkElement、から派生するためDependencyObject、この方法でのバインドは使用できません。

于 2009-01-05T23:19:36.170 に答える
1

XAML で列の Width プロパティをバインドする場合DataGridは、次の手順を実行する必要があります。

ファーストDataGridネームでDataGridTextColumn

<DataGrid>
    <DataGrid.Columns>
        <DataGridTextColumn x:Name="Col1"/>
    </DataGrid.Columns>
</DataGrid>

2番目に、上記の列へのポイントをリソースとしてDataGrid追加し、「リンク」するプロパティに次を使用します。DiscreteObjectKeyFrameBindingWidthDataGridTextColumn

<DataGrid>
    <DataGrid.Resources>
        <DiscreteObjectKeyFrame x:Key="proxyCol1" Value="{Binding ElementName=Col1}"/>
    </DataGrid.Resources>
    <DataGrid.Columns>
        <DataGridTextColumn  Width="{Binding Path=Value.Width, Mode=TwoWay, Source={StaticResource proxyCol1}}"/>
    </DataGrid.Columns>
</DataGrid>
于 2017-12-21T08:55:18.817 に答える
-2

この問題の解決策と、さらに優れた解決策を見つけました :-) WPF ツールキットをダウンロードして、DataGrid のコードを入手できます。コードを作成したら、DataGridColumn クラスを変更して、DependencyObject ではなく FrameworkElement を継承するだけです。これを行うと、問題が 1 つだけ残ります。列は論理ツリーの一部ではないため、列の DataContext は初期化されません。論理ツリーに追加すると、これが解決されます。次のように実行できます: OnColumnInitialization の場所: private void OnColumnInitialization(object sender, EventArgs e) {
AddLogicalChild(送信者); 論理ツリーの一部になったので、同じデータ コンテキストがあり、Width プロパティでバインディングを使用できます。すべてが同じ幅にバインドされている場合、列の幅が完全に同期されます。これは私のために働いた:-)ギリ

于 2011-06-16T23:12:57.567 に答える