Как программно связать сетку данных WPF с коллекцией ObservableCollection пользовательских объектов? - PullRequest
2 голосов
/ 01 февраля 2012

Я искал целую вечность и не нашел никакого решения. Название в основном охватывает то, что я пытаюсь достичь. Вот то, что у меня так далеко, что явно не работает с вырезанными ненужными вещами.

В 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;
}

Позже я добавляю предметы в базу данных. Модов

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.

Ответы [ 3 ]

5 голосов
/ 01 февраля 2012

РЕДАКТИРОВАТЬ: ваш вопрос немного неправильный, потому что вы не BIND что-то для вашей сетки вы просто SET источник элементов

тем не менее есть 2 способа достичь желаемого.

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, но это был не твой вопрос:)

1 голос
/ 01 февраля 2012

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

Как: реализовать уведомление свойства

0 голосов
/ 01 февраля 2012

Попробуйте

 protected void NotifyPropertyChanged(String info)
...