2009-06-07 4 views
4

私はWpfへの移行に苦労していましたが、lsitviewへのデータバインディングを試している間にちょうど立ち往生しています。リストビューをデータセット(データセットのデータが異なるテーブルに属しているためデータセット)にバインドします。私が試しているサンプルコードです。これは問題なく動作しますが、リストは1つの行しか表示しません。間違っている可能性があります。誰でも私をガイドできます。すべてのサンプルはdatatables.Noneを使用してデータセットにバインドしています。 .ANY入力が高く評価されます...おかげで、事前にwpf listviewをデータセットにバインドする...可能ですか?

私のXAML

<Grid> 
<TextBox Text="" Height="20" Width="100" HorizontalAlignment="Left" Margin="15,13,0,0" VerticalAlignment="Top"></TextBox> 
<TextBox Text="" Height="20" Width="100" HorizontalAlignment="Left" Margin="15,42,0,0" VerticalAlignment="Top"></TextBox> 
<ListView Margin="15,89,63,73" Name="lst" ItemsSource="{Binding}"> 
    <ListView.View> 
     <GridView> 
      <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Path=T1/Name}"></GridViewColumn> 
      <GridViewColumn Header="Place" DisplayMemberBinding="{Binding Path=T2/Name}"></GridViewColumn> 
     </GridView> 
    </ListView.View> 
</ListView> 
<!--<Button Height="19" HorizontalAlignment="Right" Name="button2" VerticalAlignment="Top" Width="46" Margin="0,42,63,0" Click="button2_Click">Add</Button>--> 
<Button Height="19" HorizontalAlignment="Right" Name="button1" VerticalAlignment="Top" Width="46" Click="button1_Click" Margin="0,43,63,0">Add</Button> 

マイコード

Dt1 = new DataTable("T1"); 
     Dt1.Columns.Add("Name"); 
     Dt1.Rows.Add("abc1"); 
     Dt1.Rows.Add("abc2"); 
     Dt2 = new DataTable("T2"); 
     Dt2.Columns.Add("Name"); 
     Dt2.Rows.Add("xyz1"); 
     Dt2.Rows.Add("xyz1"); 
     Ds = new DataSet(); 
     Ds.Tables.Add(Dt1); 
     Ds.Tables.Add(Dt2); 

     lst.DataContext = Ds; 

答えて

1

WPFは、プロパティのオフ作品を結合。あなたは、次の操作を実行してPersonオブジェクトのコレクションを表示するために、あなたのListViewためにXAMLを変更することができ

class Person 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

<ListView Margin="15,89,63,73" Name="lst" ItemsSource="{Binding}"> 
    <ListView.View> 
     <GridView> 
      <GridViewColumn Header="First Name" 
       DisplayMemberBinding="{Binding Path=FirstName}" /> 
      <GridViewColumn Header="Last Name" 
       DisplayMemberBinding="{Binding Path=LastName}" /> 
     </GridView> 
    </ListView.View> 
</ListView> 

これは、オブジェクトの最初に表示されますたとえば、次のようPersonオブジェクトを検討第1列の名前、および第2列の姓(ListViewDataContextPersonオブジェクトのコレクションであると仮定して)。理論的には

は、あなたがDataTableRowsプロパティにItemsSourceを設定することができ、ListViewDataTableの値をバインドします。問題は、DataRowクラスがその列のプロパティを公開しないことになります。行を指定する引数をとるItemプロパティのみが存在します。私の知る限り、XAMLは引数を取るプロパティをサポートしていませんので、ListViewの場合はDataTableItemsSourceとして使用することはできません。

ただし、他にもいくつかのオプションがあります。あなたは強いタイプのDataSetを作成することができ、DataTableを各列のプロパティで公開します。その後、各GridViewColumnを正しいプロパティにバインドすることができます。

もう1つの方法は、DataTableをまったく使用しないことです。あなたのデータレイヤーは依然としてソースからDataTableにデータをロードしますが、そのデータを通常のオブジェクトに変換します。 ObservableCollectionのインスタンスを作成し、各オブジェクトを追加してからListViewをバインドします。各GridViewColumnは、オブジェクトの対応するプロパティにバインドするだけです。

更新日:OPの更なる質問への答えで

:?

は、私は目的のためにXSDを使用することはできますが.IT は、各データテーブルのプロパティを保持しています。..

DataTableのプロパティだけではありません。また、DataTableの各行の値ごとにプロパティが必要です。それ以外の場合、ListViewの列がバインドされるプロパティはありません。

2

あなたがここで何をしようとしているのかわかりません...その結果は期待していますか?

abc1 xyz1 
abc2 xyz2 

、そこにあなたのテーブルの間には関係がありませんので、結合システムは、あなたがT2のどの行に関連付けるT1のどの行を推測することはできません...あなたが同じテーブル内のすべてのデータを置く必要があるのいずれかまたは2つのテーブル間でDataRelationを使用します(ただし、結合には追加のフィールドが必要です)。その後、DataTableをItemsSourceとして設定し、DataSetは設定しません。

また、あなたはアンディとトーマスに完全従うアンディ

4

こんにちは午前により示唆されるように、データを保持するために、専用のクラスを作成することができます。彼らはどちらもエレガントに概念を説明しています。

私はデータセットでのみ同じ手順を示しています。

MVVM(ModelView ViewModel)ここでは説明しません。

は、XAMLは、次の

を書くボタンのClickイベントでデータセット

private DataSet MyDataSet() 
    { 
     DataTable dtInformation1 = new DataTable(); 
     dtInformation1.Columns.Add("Name"); 
     dtInformation1.Columns.Add("Place"); 
     dtInformation1.Rows.Add(txtName.Text, txtPlace.Text); 


     DataTable dtInformation2 = new DataTable(); 
     dtInformation2.Columns.Add("Name"); 
     dtInformation2.Columns.Add("Place"); 
     dtInformation2.Rows.Add(txtName.Text + "2", txtPlace.Text + "2"); 

     DataSet Ds = new DataSet(); 
     Ds.Tables.Add(dtInformation1); 
     Ds.Tables.Add(dtInformation2); 
     return Ds; 
    } 

次を作成.CSファイルでは、この

<Grid Name="myGrid" ShowGridLines="False"> 


    <Label Height="28" Margin="12,5,0,0" Name="lblName" VerticalAlignment="Top" HorizontalAlignment="Left" Width="55">Name</Label> 
    <TextBox Height="23" Margin="73,8,85,0" Name="txtName" VerticalAlignment="Top" /> 
    <Label Height="28" Margin="12,39,0,0" Name="lblPlace" VerticalAlignment="Top" HorizontalAlignment="Left" Width="55">Place</Label> 
    <TextBox Height="23" Margin="73,44,85,0" Name="txtPlace" VerticalAlignment="Top" /> 
    <Button Height="23" HorizontalAlignment="Left" Margin="20,82,0,0" Name="btnAddRecord" VerticalAlignment="Top" Width="75" Click="btnAddRecord_Click">Add Record</Button> 
    <ListView Margin="31,119,27,45" Name="listView" *ItemsSource="{Binding}"*> 

     <ListView.View> 

      <GridView> 

       <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}"/> 

       <GridViewColumn Header="Place" DisplayMemberBinding="{Binding Place}"/> 


      </GridView> 
     </ListView.View> 
    </ListView> 
</Grid> 

のように見えます

ます。private void btnAddRecord_Click(オブジェクト送信者、RoutedEventArgs e)の

{ 

     **listView.ItemsSource = MyDataSet().Tables[0].DefaultView; 
       - OR - 
     listView.ItemsSource = MyDataSet().Tables[1].DefaultView;** 
    } 

N.B.〜あなたがリストビューのソースデータセットを割り当てることはできません。

なぜですか?聞くかもしれない? データセットは、簡単に言えば、データテーブルの集合です。

5つの異なるデータテーブルがあるとします。そして列名のどれも列番号と同じではないと言ってください。

これですべてをあなたのデータセットに割り当てました。コントロールソースはどのソースをバインドしなければならないのかをどのように知っていますか?

このような状況を克服するには、これらのディスクリートデータテーブルのすべての列を持つカスタムデータテーブルを作成し、このカスタムデータテーブルに値を割り当てて、ソースにバインドします。

それとも、明示的にデータソース

にデータテーブルを指定する必要があります。しかし、私はいつもの操作のこの種のMVVMパターンを使用することを好みます。

+0

"listView.DataContext = MyDataTable()テーブル[0];" =>なぜ? MyDataTableは、DataSetではなくDataTableを返します。 –

+0

間違えて、それが発生しました。私はmydataset()を書くことになっています。Tables [0]。 –

+0

でも、データセットをリストビューやリストボックスにバインドする方法はありません。リストボックス内の複数のデータテーブルのデータを表示するだけです.Uはオブジェクトにバインドできます。データセットとデータテーブルはオブジェクトです。どのようなビジネスオブジェクトとデータセットへのバインディングの違いは何ですか? –

1

これは私のために働いた。

public partial class MainWindow : Window 
{ 

    public ObservableCollection<DataTable> _observableCollection = 
    new ObservableCollection<DataTable>(); 

    public MainWindow() 
    { 
     InitializeComponent(); 

     DataTable dt1 = new DataTable(); 
     dt1.Columns.Add("OrderID"); 
     dt1.Columns.Add("CustomerID"); 
     dt1.Columns.Add("ProductID"); 
     dt1.Rows.Add("test1", "test2", "test3"); 

     DataTable dt2 = new DataTable(); 
     dt2.Columns.Add("OrderID"); 
     dt2.Columns.Add("CustomerID"); 
     dt2.Columns.Add("ProductID"); 
     dt2.Rows.Add("test4", "test5", "test6"); 

     _observableCollection.Add(dtInformation1); 
     _observableCollection.Add(dtInformation2); 
    } 

    public ObservableCollection<DataTable> _Collection 
     { get { return _observableCollection; } } 

リストビューXAML

<ListView Height="Auto" 
HorizontalAlignment="Stretch" 
Name="somename" 
ItemsSource="{Binding _Collection}" VerticalAlignment="Stretch" Width="Auto" > 

<GridViewColumn Header="OrderID" Width="auto" > 
     <GridViewColumn.CellTemplate> 
      <DataTemplate> 
       <Button Tag="{Binding OrderID}" Content="{Binding OrderID}"/> 
      </DataTemplate> 
     </GridViewColumn.CellTemplate> 
    </GridViewColumn> 
    <GridViewColumn Width="auto" DisplayMemberBinding="{Binding CustomerID}" Header="CustomerID" /> 
    <GridViewColumn Width="auto" DisplayMemberBinding="{Binding ProductID}" Header="ProductID" /> 

関連する問題