如何以编程方式将WPF Datagrid绑定到自定义对象的ObservableCollection?

时间:2012-02-01 00:30:25

标签: c# .net wpf data-binding datagrid

我一直在寻找年龄,但没有找到任何解决方案。标题基本上涵盖了我想要完成的任务。到目前为止,我所拥有的内容显然不适用于无关紧要的内容。

在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那样访问会更好。

3 个答案:

答案 0 :(得分:5)

编辑:你的问题有点不对,因为你没有 BIND 某些东西你只需设置 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,但这不是你的问题:)

答案 1 :(得分:1)

您的Mod类需要实现INotifyPropertyChanged以适当更新屏幕。

How To: Implement Property Notification

答案 2 :(得分:0)

尝试

 protected void NotifyPropertyChanged(String info)