2012-02-01 95 views
2

我一直在尋找年齡,還沒有找到任何解決方案。標題基本上涵蓋了我想要完成的事情。這是迄今爲止我所看到的,顯然不適用於無關緊要的東西。如何以編程方式將WPF Datagrid綁定到自定義對象的ObservableCollection?

在MainWindow.xaml.cs:

public MainWindow() 
{ 
    InitializeComponent(); 

    ModGrid = new DataGrid(); 
    ModGrid.CanUserReorderColumns = false; 

    DataGridTextColumn Name = new DataGridTextColumn(); 
    Name.Header = "Name"; 
    Name.MinWidth = 45; 
    Name.Width = (DataGridLength)(new DataGridLengthConverter()).ConvertFromString("*"); 
    Binding nameBinding = new Binding("Name"); 
    nameBinding.Mode = BindingMode.OneWay; 
    Name.Binding = nameBinding; 
    ModGrid.Columns.Add(Name); 

    DataGridTextColumn Tags = new DataGridTextColumn(); 
    Tags.Header = "Tags"; 
    Tags.MinWidth = 40; 
    Tags.Width = 200; 
    Binding tagsBinding = new Binding("Tags"); 
    tagsBinding.Mode = BindingMode.OneWay; 
    Tags.Binding = tagsBinding; 
    ModGrid.Columns.Add(Tags); 

    // There are more columns but you get the idea 

    ModGrid.ItemsSource = Database.Mods; 
} 

private void RibbonWindow_Loaded(object sender, RoutedEventArgs e) 
{ 
    ModGrid.DataContext = Database.Mods; 
} 

後來我添加項目Database.Mods

void Fetcher_RequestComplete(bool error, string result, int requestsLeft) 
{ 
    if (!error) 
    { 
     Database.Mods = Parser.ParseMods(result); 
    } 
} 

這是所有在database.cs

public static class Database 
{ 
    public static ObservableCollection<Mod> Mods = new ObservableCollection<Mod>(); 
} 

這是所有在mod.cs

public class Mod 
{ 
    public Mod() { } 

    public Image Status; 
    public string Name; 
    public string Description; 
    public string Author; 
    public string Tags; 
    public int Views; 
    public string Link; 
    public string[] Versions; 
    public string[] TagsList; 
} 

對不起,關於代碼垃圾郵件,但我還沒有看到如何做到這一點完全程序化,這是必要的,我這樣做。任何迴應都是非常感謝

編輯:

雖然我沒有找到一個答案,如果你在這種情況下,我發現它會更好,只是做一個自定義的控制,並具有從XAML這樣的訪問。

+1

我要問 - 爲什麼它必須在後面的代碼?這會產生「令人討厭」的代碼,確實很難維護。是什麼阻止你使用視圖模型和XAML中設置的數據綁定並使用數據模板來正確設置它?我的意思是使用這種方法 - 你不妨回到winforms .... – tsells 2012-02-01 01:51:20

+0

我使用功能區選項卡,我有一個內容控件,所以當你切換標籤內容的變化。我創建了這些東西來放入代碼中的內容控件,並手動將其分配給contentcontrol。這可能不是做這件事的最好方式,但我幾乎沒有足夠的經驗來用XAML做任何其他方式。 – Koraken 2012-02-01 02:34:58

回答

5

編輯:你的問題是有點不對,因爲你不BIND東西,你的網格,你只需SET的的ItemsSource

仍然存在有兩種方法可以達到你想要的效果。

void Fetcher_RequestComplete(bool error, string result, int requestsLeft) 
{ 
if (!error) 
{ 
    Database.Mods.AddRange(Parser.ParseMods(result));//you can use foreach or write AddRange extension 
} 
} 

void Fetcher_RequestComplete(bool error, string result, int requestsLeft) 
{ 
if (!error) 
{ 
    ModGrid.ItemsSource = Parser.ParseMods(result)); 
} 
} 

的清潔方法是MVVM但是那不是你的問題:)

+0

使用第二個例子解決了這個問題,謝謝:) – Koraken 2012-02-01 15:28:35

0

嘗試

protected void NotifyPropertyChanged(String info) 
+0

試過了,沒有運氣:\ – Koraken 2012-02-01 01:35:26

+0

如果調試NotifyProtertyChanged被調用?設置ItemsSource和DataContext可能太多了。嘗試刪除DataContext。爲什麼要在每次調用時創建新(新)數據庫的satic數據庫。如果您在物業上提供新的物業,您會如何看待更新?爲什麼是靜態的? – Paparazzi 2012-02-01 01:46:35

+0

NotifyPropertyChanged在這裏賦值時不會被調用Database.Mods = Parser.ParseMods(result);'丟棄DataContext並不能解決問題。我不確定你是什麼意思關於數據庫。如果這就是你的意思,我不知道每個呼叫都會完成新的ObservableCollection ()。但是放棄那部分也沒有改變任何東西。 – Koraken 2012-02-01 02:26:55

相關問題