【问题标题】:Bindings on Datagrids in code Behind后台代码中的数据网格绑定
【发布时间】:2016-07-23 03:27:58
【问题描述】:

我正在为自己编写一本用 WPF/C# 编写的食谱。 此外,我是数据绑定的新手。

我的问题是,我想在运行时在代码后面的 TabItem 中生成一个 Datagrid,包括绑定。我无法在 XAML 中设置 Datagrid,因为我想动态创建所有 TabItem。

到目前为止的代码如下:

XAML:

<UniformGrid Columns="2" Rows="1">
<TabControl Name="TabControl" TabStripPlacement="Left"/>
  <TabItem Header= "first dish" Name = "firstdish"/>
</UniformGrid>

XAML.cs 生成:

//New Grid
        var Grid = new DataGrid();

        //Start Test list creation with three items
        var TestList = new List<Receipt>();

        //Set binding
        Grid.ItemsSource = TestList;

        var Rec = new Receipt();
        Rec.Creator = "DaJohn1";
        Rec.ID = 1;
        Rec.Title = "TestReceipt1";

        var Rec2 = new Receipt();
        Rec2.Creator = "DaJohn2";
        Rec2.ID = 2;
        Rec2.Title = "TestReceipt2";

        var Rec3 = new Receipt();
        Rec3.Creator = "DaJohn3";
        Rec3.ID = 3;
        Rec3.Title = "TestReceipt3";

        TestList.Add(Rec);
        TestList.Add(Rec2);
        TestList.Add(Rec3);
        //End Test list creation

        //Add Column
        var SingleColumn = new DataGridTextColumn();
        Grid.Columns.Add(SingleColumn);
        SingleColumn.Binding = new Binding("Creator");
        SingleColumn.Header = "Creator";

        //Add Column
        var SingleColumn2 = new DataGridTextColumn();
        Grid.Columns.Add(SingleColumn2);
        SingleColumn2.Binding = new Binding("Title");
        SingleColumn2.Header = "Title";

        //Set tabitem content to datagrid
        firstdish.Content = Grid;

我得到的只是一个有四行的数据网格(看起来项目的数量是正确的),它们都是空的,没有数据可以看到。 自上周星期一以来,我一直在盯着这个问题,但在任何地方都找不到答案。

感谢您提供任何想法和解决方案。

【问题讨论】:

  • Receipt 类中的 Creator 变量是否公开?为了让 UI 访问它,它需要如下所示: public string Creator {get;set;}

标签: c# wpf binding datagrid


【解决方案1】:

尝试改变

var TestList = new List<Receipt>();

var TestList = new ObservableCollection<Receipt>();

因为它会自动通知 UI 有关更改。 我有一个similar problem,其中的项目未呈现,所以可能就是这样。

【讨论】:

  • 这没有做任何改变,抱歉。
【解决方案2】:

我已经获取了您的代码并检查了您所做的一些事情:主要错误是在您的 xaml 代码中您创建了 Tab 控件,然后将 TabItem 放在它之外,Tabitem 必须在控件内部才能工作正确。所以第一个错误是:

<TabControl Name="TabControl" TabStripPlacement="Left">
<TabItem Header="First dish" Name = "firstdish" />
</TbControl>

在我看来,在继续之前你需要做的其他事情是:

  • 将您的窗口或其他 UI 元素本身指定为数据上下文
  • 验证您的 Receipt 类是否实现了必须由其所有属性引发的 INotifyPropertyChanged 事件,或者将您的属性实现为 DependencyProperties(即使后者不是必需的)
  • 在 ObservableCollection 中转换您的数据源 TestList
  • 将 TestList 创建为类属性而不是局部变量,以便将其放入数据上下文中

我使用上述指示和您的代码制作了一个小示例,让您更好地了解它是如何工作的。您可以在此处下载 zip: TestClassDataGrid.zip

【讨论】:

    【解决方案3】:

    下面的代码应该适合你,

    XAML:

     <TabControl Name="TabControl" TabStripPlacement="Left">
           <TabItem Header= "first dish" Name = "firstdish"/>
      </TabControl>
    

    .cs 文件

    public Window()
            {
                InitializeComponent();
    
                var Grid = new DataGrid();
    
                //Start Test list creation with three items
                var TestList = new List<Receipt>();
    
                //Set binding
                Grid.ItemsSource = TestList;
    
                var Rec = new Receipt();
                Rec.Creator = "DaJohn1";
                Rec.ID = 1;
                Rec.Title = "TestReceipt1";
    
                var Rec2 = new Receipt();
                Rec2.Creator = "DaJohn2";
                Rec2.ID = 2;
                Rec2.Title = "TestReceipt2";
    
                var Rec3 = new Receipt();
                Rec3.Creator = "DaJohn3";
                Rec3.ID = 3;
                Rec3.Title = "TestReceipt3";
    
                TestList.Add(Rec);
                TestList.Add(Rec2);
                TestList.Add(Rec3);
                //End Test list creation
    
                //Add Column
                var SingleColumn = new DataGridTextColumn();
                Grid.Columns.Add(SingleColumn);
                SingleColumn.Binding = new Binding("Creator");
                SingleColumn.Header = "Creator";
    
                //Add Column
                var SingleColumn2 = new DataGridTextColumn();
                Grid.Columns.Add(SingleColumn2);
                SingleColumn2.Binding = new Binding("Title");
                SingleColumn2.Header = "Title";
    
                //Set tabitem content to datagrid
    
                Grid.AutoGenerateColumns = false;
                firstdish.Content = Grid;
            }
    

    【讨论】:

      猜你喜欢
      • 2015-07-31
      • 2017-08-03
      • 1970-01-01
      • 2011-09-14
      • 1970-01-01
      • 2012-10-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多