2012-02-01 6 views
2

Я искал возраст и не нашел решения. Название в основном охватывает то, что я пытаюсь выполнить. Вот что у меня есть до сих пор, что явно не работает с нерелевантными вещами.Как программно привязать WPat 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; 
} 

Извините за код спама, но я не видел, как это сделать полностью программно, и это необходимо для меня. Любые ответы вообще очень оценен!

Edit:

В то время как я нашел ответ, если ваш в этой ситуации я нашел, было бы гораздо лучше просто сделать пользовательский элемент управления, и иметь доступ из XAML таким образом.

+1

я должен спросить - почему это должно быть в коде позади? Это создает «неприятный» код и действительно затрудняет его поддержание. Что мешает вам использовать модель представления с привязками данных, настроенными в XAML, и с помощью шаблона данных правильно настроить его? Я имею в виду использование этого подхода - вы можете также вернуться к winforms .... – tsells

+0

Я использую вкладки ленты, и у меня есть contentcontrol, поэтому, когда вы переключаете между вкладками, содержимое изменяется. Я создаю материал для добавления содержимого в код и назначаю его в contentcontrol вручную. Это, вероятно, не самый лучший способ сделать это, но я недостаточно опытен с XAML, чтобы сделать это любым другим способом. – Koraken

ответ

5

EDIT: Ваш вопрос немного не так, потому что вы не 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

1

Ваш класс Mod должен реализовать INotifyPropertyChanged, чтобы обновить экран соответствующим образом.

How To: Implement Property Notification

+0

Просто попытался сделать это, но не повезло. Это моя реализация [здесь] (http://pastebin.com/BgQCTxUZ) – Koraken

0

Попробуйте

protected void NotifyPropertyChanged(String info) 
+0

Пробовал, не повезло: \ – Koraken

+0

Если вы отлаживаете вызов NotifyProtertyChanged? Установка элементов ItemsSource и DataContext может быть слишком большой. Попробуйте удалить DataContext. Зачем нужна база данных satic, где вы создаете новую (новую) базу данных для каждого вызова.Как вы ожидаете, что обновление будет видно, если вы отправляете новое свойство? Почему статический? – Paparazzi

+0

NotifyPropertyChanged не вызывается при назначении его здесь. Database.Mods = Parser.ParseMods (result); 'Dropping DataContext не решает проблему. Я не уверен, когда вы имеете в виду базу данных. Я не знал, что '= new ObservableCollection ()' было выполнено для каждого вызова, если это то, что вы имеете в виду. Но отказ от этой части тоже ничего не изменил. – Koraken

Смежные вопросы