web-dev-qa-db-ja.com

WPFのデータグリッドバインディング

これはすでに質問されていることは知っていますが、開発者が提案することはほぼすべて行いました。

<DataGrid x:Name="Imported" VerticalAlignment="Top" DataContext="{Binding Source=list}"  AutoGenerateColumns="False" CanUserResizeColumns="True">
    <DataGrid.Columns>                
        <DataGridTextColumn Header="ID" Binding="{Binding Path=ID}"/>
        <DataGridTextColumn Header="Date" Binding="{Binding Path=Date}"/>
    </DataGrid.Columns>
</DataGrid>

これをモーダルダイアログボックスに表示して、モーダルダイアログボックスのコンストラクターにライセンスリストを追加しようとしています。しかし、データグリッド内にはまだ何も取り込まれていません。

コンストラクターコード:

public diagboxclass()
{
    List<object> list = new List<object>();
    list = GetObjectList();
}

public class object
{
    string id;
    DateTime date;
    public string ID
    {
        get { return id; }
        set { id = value; }
    }
    public DateTime Date
    {
        get { return date; }
        set { date = value; }
    }
}

オブジェクトリストに何か関係があると思いますか?

19
alice7

クラス名としてobjectを使用しないでください:

public class MyObject //better to choose an appropriate name
{
    string id;
    DateTime date;
    public string ID
    {
       get { return id; }
       set { id = value; }
    }
    public DateTime Date
    {
       get { return date; }
       set { date = value; }
    }
}

このクラスにはINotifyPropertyChangedを実装する必要があり、もちろんProperty setterで呼び出しますです。それ以外の場合、変更はUIに反映されません。

Viewmodelクラス/ダイアログボックスクラスにはaPropertyMyObjectリストが必要です。 ObservableCollection<MyObject>は行く方法です:

public ObservableCollection<MyObject> MyList
{
     get...
     set...
}

xamlで、ItemssourceMyObjectのコレクションに設定する必要があります。 (Datacontextはダイアログボックスクラスでなければなりません!)

<DataGrid ItemsSource="{Binding Source=MyList}"  AutoGenerateColumns="False">
   <DataGrid.Columns>                
     <DataGridTextColumn Header="ID" Binding="{Binding ID}"/>
     <DataGridTextColumn Header="Date" Binding="{Binding Date}"/>
   </DataGrid.Columns>
</DataGrid>
32
blindmeis

上記のオブジェクトリストを見ることなく、DataGridのItemsSourceプロパティではなく、DataContextプロパティにバインドする必要があると思います。

<DataGrid x:Name="Imported" VerticalAlignment="Top" ItemsSource="{Binding Source=list}"  AutoGenerateColumns="False" CanUserResizeColumns="True">
    <DataGrid.Columns>                
        <DataGridTextColumn Header="ID" Binding="{Binding ID}"/>
        <DataGridTextColumn Header="Date" Binding="{Binding Date}"/>
   </DataGrid.Columns>
</DataGrid>

(これは、DataGridを含む要素[UserControlなど]がlistコレクションを含むオブジェクトにバインドされたits DataContextを持っていることを前提としています。DataGridはItemsControlは、ItemsSourceプロパティに依存して、行をバインドするコレクションを定義します。したがって、listがコントロールのDataContextにバインドされたオブジェクトのプロパティではない場合、両方を設定するDataContext={Binding list}およびItemsSource={Binding list} DataGridで...)

22
Dan J

背後のコードでこれを試してみてください

   public diagboxclass()
   {
         List<object> list = new List<object>();
         list = GetObjectList();
         Imported.ItemsSource = null;
         Imported.ItemsSource = list;
   }

また、Blindmeisが述べているように、リストが効果的に設定されていることを確認し、c#で既に関数が与えられている単語を使用しないでください。

5
Schuere