【问题标题】:How do I programmatically bind a WPF Datagrid to a ObservableCollection of custom objects?如何以编程方式将 WPF Datagrid 绑定到自定义对象的 ObservableCollection?
【发布时间】:2012-02-23 17:42:41
【问题描述】:

我一直在寻找年龄,但没有找到任何解决方案。标题基本上涵盖了我想要完成的事情。到目前为止,这就是我所拥有的,显然不能处理不相关的内容。

在 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 访问。

【问题讨论】:

  • 我不得不问 - 为什么它必须在代码后面?这会创建“讨厌的”代码,并且确实难以维护。是什么阻止您使用带有 XAML 中设置的数据绑定的视图模型并使用数据模板正确设置它?我的意思是使用这种方法 - 你还不如回到 winforms....
  • 我正在使用功能区选项卡,并且我有一个内容控件,因此当您在选项卡之间切换时,内容会发生变化。我创建了要放入代码中的内容控件的内容,并手动将其分配给内容控件。这可能不是最好的方法,但我对 XAML 的经验还不够丰富,无法以任何其他方式做到这一点。

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


【解决方案1】:

编辑:您的问题有点错误,因为您没有 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,但这不是你的问题 :)

【讨论】:

    【解决方案2】:

    试试

     protected void NotifyPropertyChanged(String info)
    

    【讨论】:

    • 如果您调试 NotifyProtertyChanged 会被调用吗?同时设置 ItemsSource 和 DataContext 可能太多了。尝试删除 DataContext。为什么要在每次调用时创建新(新)数据库的 satic 数据库。如果您在物业上交付新产品,您希望如何看到更新?为什么是静态的?
    • NotifyPropertyChanged 在此处分配时不会被调用Database.Mods = Parser.ParseMods(result); Dropping DataContext 没有解决问题。我不确定您何时指的是数据库。我不知道= new ObservableCollection&lt;Mod&gt;() 在每次通话中都已完成,如果这就是您的意思。但是删除那部分也没有改变任何东西。
    【解决方案3】:

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

    How To: Implement Property Notification

    【讨论】:

    • 刚刚尝试过这样做,但没有运气。这是我的实现here
    猜你喜欢
    • 2014-08-23
    • 2014-04-18
    • 2013-10-14
    • 2015-10-25
    • 1970-01-01
    • 1970-01-01
    • 2016-09-01
    • 2015-11-02
    • 1970-01-01
    相关资源
    最近更新 更多