2012-05-25 158 views
1

我正在使用DataGrids,但我努力綁定我的數據,因爲列的數量因所顯示的信息而異。創建一個自定義DataGrid的ItemsSource

所以,我試圖做的是創建和對象,其中包含我需要在某個點的所有列和行,並將此對象綁定到ItemsSource屬性。既然我已經在WindowsForms與DataGridViews工作,我心裏有這樣的事情:

DataTable myTable = new DataTable(); 

DataColumn col01 = new DataColumn("col 01"); 
myTable.Columns.Add(col01); 
DataColumn col02 = new DataColumn("col 02"); 
myTable.Columns.Add(col02); 

DataRow row = myTable.NewRow(); 
row[0] = "data01"; 
row[1] = "data02"; 
myTable.Rows.Add(row); 

row = myTable.NewRow(); 
row[0] = "data01"; 
row[1] = "data02"; 
myTable.Rows.Add(row); 

但我一直沒能找到一種方法做同樣的事情在WPF,因爲我需要一些列成爲DataGridComboBoxColumns例。

其實我已經在這個網站上看過很多關於它的帖子,但是沒有一個對我有幫助。我真的迷失了。

任何人都可以幫助我嗎?我只需要能夠創建一個可能包含DataGridTextColumns或DataGridComboBoxColumns等的表格,以便將此最終對象綁定到DataGrid的ItemsSource屬性。

希望有人能幫助我。

回答

4

好吧,讓我嘗試舉個例子,它類似於您的需求

假設我們使用這個類:

public class MyObject 
{ 
    public int MyID; 
    public string MyString; 
    public ICommand MyCommand; 
} 

,我們願意以顯示DataGrid上市的ID,並第二列爲Button,其內容爲MyString作爲內容,當點擊該內容時,將啓動無論您想要在新窗口中打開的ICommandMyCommand

這裏是你應該有觀察側什麼:

<DataGrid ItemsSource="{Binding MyList}" AutoGenerateColumns="False"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Header="ID" Binding="{Binding MyID}" /> 
      <DataGridTemplateColumn Header="Buttons"> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <Button Content="{Binding MyString}" Command="{Binding MyCommand}" /> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 
     </DataGrid.Columns> 
    </DataGrid> 

這將顯示一個DataGrid把所有的內容在名爲「MYLIST」的IEnumerable<MyObject>,並顯示定義如前兩列。

現在如果您需要定義命令。 首先,我建議你閱讀this introductory link to MVVM並採取RelayCommand類(這就是我們要利用你的問題)

因此,在你ViewModel,它定義了MyList,這裏是你應該如何定義一些一個有用的對象:

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

// blah blah blah 

public void InitializeMyList() 
{ 
    MyList = new ObservableCollection<MyObject>(); 
    for (int i = 0; i < 5; i++) 
    { 
    MyList.Add(InitializeMyObject(i)); 
    } 
} 

public MyObject InitializeMyObject(int i) 
{ 
    MyObject theObject = new MyObject(); 
    theObject.MyID = i; 
    theObject.MyString = "The object " + i; 
    theObject.MyCommand = new RelayCommand(param =< this.ShowWindow(i)); 
    return theObject 
} 

private void ShowWindow(int i) 
{ 
    // Just as an exammple, here I just show a MessageBox 
    MessageBox.Show("You clicked on object " + i + "!!!"); 
} 
+0

謝謝您的回覆,我想它和它的作品,但我的問題仍然是,我需要它是動態的,所以,我希望能夠做你告訴我沒有做什麼聲明XAML文件中的列,有沒有辦法做到這一點? – Dante

+0

你想在你的欄目中顯示什麼?我的意思是,它取決於一些參數嗎?您可以輕鬆地在代碼中聲明手動和動態列,給我更多的細節你需要什麼,我會告訴你一個好代碼片斷,您可以使用 – Damascus

+0

謝謝。那麼,事實證明,我的dataGrid將顯示不同的數據集。這組數據可能包含按鈕列,組合框列,複選框列或文本列。所以,我的想法是將AutogenerateColumns屬性設置爲true,並將包含列結構和數據的對象傳遞給它,該對象必須在某個點顯示。出於這個原因,我不能手動定義XAML中的列。預先感謝@大馬士革 – Dante

2

綁定到自定義對象的ObservableCollection的簡單示例。將更多屬性添加到自定義對象以匹配您希望行的外觀。

using System.Collections.ObjectModel; 

public MyClass 
{ 
     public ObservableCollection<MyObject> myList { get; set; } 

     public MyClass() 
     { 
      this.DataContext = this; 
      myList = new ObservableCollection<MyObject>(); 
      myList.Add(new MyObject() { MyProperty = "foo", MyBool = false }; 
      myList.Add(new MyObject() { MyProperty = "bar", MyBool = true }; 
     } 
} 

public MyObject 
{ 
     public string MyProperty { get; set; } 
     // I believe will result in checkbox in the grid 
     public bool MyBool { get; set; } 
     //...as many properties as you want 
} 

使用XAML

<DataGrid ItemsSource= "{Binding myList}" /> 

可能是一些小的語法錯誤,我寫道,完全在SO窗口。

+0

謝謝您的回覆,但我試圖避免使用數據表根據我所知道的,因爲,在DataColumn的不允許添加一些不同的文本等的控制,如組合框,按鈕,複選框,對? – Dante

+0

在這種情況下,你應該做的自定義對象的一個​​ObservableCollection你讓將代表每行,我會編輯的基本實現。 –

+0

這有效,但是,如果我想要添加一個按鈕或組合框,我應該聲明哪些類型的屬性? – Dante

-1

我是新來WPF和使用大馬士革的例子來學習列表到DataGrid的結合。但是當我使用他的答案時,我發現我的數據網格會填充正確數量的行,但不會與MyObject類中的任何屬性一起填充。我做了一些搜索,然後偶然發現了我必須做的事情。

我不得不封裝的MyObject類的屬性,讓他們展現。讓他們公開是不夠的。

前:

public class MyObject 
{ 
    public int MyID; 
    public string MyString; 
    public ICommand MyCommand; 
} 

後:

public class MyObject 
{ 
    private int _myID; 

    public int MyID 
    { 
     get { return _myID; } 
     set { _myID = value; } 
    } 
    private string _myString; 

    public string MyString 
    { 
     get { return _myString; } 
     set { _myString = value; } 
    } 
    private ICommand _myCommand; 

    public ICommand MyCommand 
    { 
     get { return _myCommand; } 
     set { _myCommand = value; } 
    } 
} 

感謝您對大馬士革一個很好的例子,並感謝您對但丁一個很大的問題。我不知道這是否是因爲您的帖子版本發生了變化,但希望這可以幫助像我這樣的新成員加入WPF。

相關問題