2009-03-13 19 views
1

DataGridの列をSilverlightで動的に作成してバインドすることができます。しかし、私はそれらの列にデータをバインドする方法を見つけることができません。SilverlightのDataGridにデータを手動で追加する方法

AutoGenerateColumns = trueで任意のタイプのオブジェクトをバインドしようとすると、オブジェクトの各プロパティの名前が列として追加され、データが表示されない既存の列に加えてオブジェクト情報がグリッドに表示されます。

AutoGenerateColumns = falseのリストを適用すると、テーブルには表示されますが列にはデータは表示されません。

私はデータガードにデータを表示する必要がある場合ごとに特定のオブジェクトを作成したくありません。

私は列名をプロパティの名前に限定したくありません。スペースを含む名前。

リストまたは辞書配列をデータグリッドにバインドできるようにします。私はまた、どのようなデータがどの列に現れるかを制御できるようにしたい。

答えて

1

はあなたがに情報をバインドするクラスまたはいくつかの他の容器を持っていると仮定し、あなたは次のことができます。

DataGridTextColumn product = new DataGridTextColumn(); 
       product.Binding = new System.Windows.Data.Binding("Product"); 
       product.Header = "Product"; 

       DataGridTextColumn date = new DataGridTextColumn(); 
       date.Binding = new System.Windows.Data.Binding("Date"); 
       date.Header = "Date"; 

       DataGridTextColumn version = new DataGridTextColumn(); 
       version.Binding = new System.Windows.Data.Binding("FileVersion"); 
       version.Header = "Version"; 

       DataGridTextColumn timestamp = new DataGridTextColumn(); 
       timestamp.Header = "TimeStamp"; 
       timestamp.Binding = new System.Windows.Data.Binding("TimeStamp"); 

       DataGridTextColumn user = new DataGridTextColumn(); 
       user.Header = "User"; 
       user.Binding = new System.Windows.Data.Binding("User"); 

       rpdata.Columns.Add(product); 
       rpdata.Columns.Add(date); 
       rpdata.Columns.Add(version); 
       rpdata.Columns.Add(timestamp); 
       rpdata.Columns.Add(user); 

これで、データグリッドのitemsourceを、あなたが持っているアイテムのコレクションに設定するだけです。

これにより、表示するヘッダーを設定することができ、コンテナ内の変数に情報をバインドして、追加する列の情報だけを表示することができます。

+0

これは、列バインディングのみを指定しますが、ソースは指定しません。 – Raptor

+0

それは正しいです。最初に述べたように、グリッドにカスタムオブジェクトを既にバインドしていると仮定します(rpdata)。各列のバインディングは、そのカスタムオブジェクト内のプロパティの名前を参照します。 – Johannes

1

あなたは、ほとんどが、おそらくだが、ちょうどあなたのXAMLで微妙に間違った何かを持って、ここで働く例です:

<UserControl x:Class="Testproject.EditableDataGrid" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data" 
    Width="400" Height="300"> 
    <Grid x:Name="LayoutRoot" Background="White"> 
     <data:DataGrid x:Name="myDataGrid" AutoGenerateColumns="False"> 
      <data:DataGrid.Columns> 
       <data:DataGridTextColumn Header="My text" Binding="{Binding StringValue}" /> 
       <data:DataGridCheckBoxColumn Header="Check Box" Binding="{Binding IsChecked}" /> 
       <data:DataGridTemplateColumn Header="A template column"> 
        <data:DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <StackPanel Orientation="Horizontal"> 
          <Rectangle Width="20" Height="5" Fill="Red"/> 
          <TextBlock Text="{Binding IntValue}" /> 
         </StackPanel> 
        </DataTemplate> 
       </data:DataGridTemplateColumn.CellTemplate> 

      </data:DataGridTemplateColumn> 
       <data:DataGridTextColumn Header="My int" Binding="{Binding IntValue}" /> 
      </data:DataGrid.Columns> 
     </data:DataGrid> 
    </Grid> 
</UserControl> 

using System.Windows; 
using System.Windows.Controls; 
using System.Collections.Generic; 

namespace Testproject 
{ 
    public partial class EditableDataGrid :UserControl 
    { 
     public EditableDataGrid() 
     { 
      InitializeComponent(); 

      myDataGrid.ItemsSource = new List<ClassForDataGridTest>() 
          { 
           new ClassForDataGridTest() {StringValue="hello", IntValue=21, IsChecked=false} 
           , new ClassForDataGridTest() {StringValue="the second", IntValue=122, IsChecked = true} 
          }; 
     } 
    } 

    public class ClassForDataGridTest : DependencyObject 
    { 

     public string StringValue {get; set;} 

     public int IntValue {get; set;} 

     public bool IsChecked { get; set; } 

    } 
} 
関連する問題