0

WPF アプリケーションでデータグリッドを構築しています。ItemSourceDatagrid の はIEnumerableコレクションにバインドされています。私は自分のプロジェクトの ViewModel を知りません。データグリッド itemsource をデータグリッドにバインドすると、その場で列ヘッダーと行の値が取得されます。

ヘッダーはありません。それは何でもありかもしれません。データグリッドで選択した行の詳細情報をグリッドに表示する必要があります。

これを行うには、SelectedItem.HeaderName をグリッドのテキストブロックにバインドする必要があります。しかし、ここでの問題は、ヘッダーの名前を知らないことです。だから私は単純にハードコードすることはできませんSelectedItem.Headername

また、列数はそれぞれ異なる場合があります。したがって、私の詳細ビューは、データグリッドの行が選択されたときに、ヘッダー名とそれぞれの値を動的に番号付けする必要があります。

今のところ、以下のようにxamlで結果をハーコーディングして見ました。特定のファイルについて、それぞれの列ヘッダーを知っているため、

<Label HorizontalAlignment="Stretch"
       VerticalAlignment="Center"
       Grid.Row="0"
       Grid.Column="0">Header2:
</Label>

<TextBlock Grid.Row="0"
           Grid.Column="1"
           Name="Header2"
           Text="{Binding SelectedItem.date,  ElementName=dataGrid1}"
           Width="auto"
           Height="auto"
           HorizontalAlignment="Stretch"
           VerticalAlignment="Center" />

<Label Grid.Row="0"
       Grid.Column="2"
       VerticalAlignment="Center">Header3:</Label>

<TextBlock Grid.Row="0"
           Grid.Column="3"
           Name="username"
           Text="{Binding SelectedItem.Header3, ElementName=dataGrid1}"
           Width="auto"
           Height="auto"
           HorizontalAlignment="Stretch"
           VerticalAlignment="Center" />

<Label Grid.Row="0"
       Grid.Column="4"
       VerticalAlignment="Center">Header4:</Label>

<TextBlock Grid.Row="0"
           Grid.Column="5"
           Name="level"
           Text="{Binding SelectedItem.header4, ElementName=dataGrid1}"
           Width="auto"
           Height="auto"
           HorizontalAlignment="Stretch"
           VerticalAlignment="Center" />

<Label Grid.Row="1"
       Grid.Column="0"
       VerticalAlignment="Center">Header5:</Label>

<TextBlock Grid.Row="1"
           Grid.Column="1"
           Name="logger"
           Text="{Binding SelectedItem.header5, ElementName=dataGrid1}"
           Width="auto"
           Height="auto"
           HorizontalAlignment="Stretch"
           VerticalAlignment="Center" />

<Label Grid.Row="1"
       Grid.Column="2"
       VerticalAlignment="Center">Headr6:</Label>

<TextBlock Grid.Row="1"
           Grid.Column="3"
           Name="thread"
           Text="{Binding SelectedItem.header6, ElementName=dataGrid1}"
           Width="auto"
           Height="auto"
           HorizontalAlignment="Stretch"
           VerticalAlignment="Center" />

私は初心者なので、これを行う方法がわかりませんでした。あなたが私を助けようとしたら、私はうれしいです。また、この動的な列の生成であるカウントに関連して読む必要があるいくつかの概念を提案し、動的な列ヘッダーを UI の他のコントロールに割り当てます。前もって感謝します!

4

1 に答える 1

0

DataGrid ヘッダーと DataGrid でコレクションを作成したオブジェクト プロパティに応じて、グリッドの動的生成 (TextBlock + TextBox コレクション) を含む小さなプロジェクトを作成しました。それがあなたが探しているものであることを願っています。SkyDriveからダウンロードできます

XAML :

 <Grid>
        <StackPanel>
        <StackPanel x:Name="myStackPanel" Orientation="Vertical"></StackPanel>
            <DataGrid x:Name="myDataGrid" ItemsSource="{Binding MySource}" AutoGenerateColumns="True">
        </DataGrid>

        </StackPanel>
    </Grid>

Loaded イベント ハンドラでこれを設定しました。

 for (int i = 0; i < myDataGrid.Columns.Count; i++)
                    {
                        var childStackPanel = new StackPanel { Orientation = Orientation.Horizontal };

                        var myTextBlock = new TextBlock { Text = myDataGrid.Columns[i].Header + " : " };

                        var myTextBox = new TextBox { Width = 200 };

                        Type myType = typeof(Text);
                        IList<PropertyInfo> props = new List<PropertyInfo>(myType.GetProperties());
                        myTextBox.SetBinding(TextBox.TextProperty,
                                              new Binding("SelectedItem." + props[i].Name) { ElementName = "myDataGrid" });
                        childStackPanel.Children.Add(myTextBlock);
                        childStackPanel.Children.Add(myTextBox);
                        myStackPanel.Children.Add(childStackPanel);
                    }

テキスト クラス :

public class TranslationText
    {
        private string _translation;
        private bool _isTranslated;

        public string Translation
        {
            get { return _translation; }
            set
            {
                _translation = value;
            }
        }

        public bool IsTranslated
        {
            get { return _isTranslated; }
            set
            {
                _isTranslated = value;
            }
        }

    }
于 2013-01-22T08:32:52.600 に答える