【问题标题】:Cannot populate a WPF DataGrid using Python无法使用 Python 填充 WPF DataGrid
【发布时间】:2018-12-31 03:07:20
【问题描述】:

我在使用 Python.NET 将数据绑定到 WPF DataGrid 时遇到问题

代码如下所示,我尝试了三种不同的方法来绑定数据 - 每种方法都失败了,错误消息作为注释包含在下面的代码中

如果我不尝试添加数据,则 datagarid 会正确显示标题。但我无法用任何数据填充网格。

任何帮助将不胜感激!!!

道格

import clr

#.NET references
import System
import System.Windows.Controls as WPFControls
import System.Windows.Data as WPFBindings


def getCustomToolPropertyContent():

   #Create a Grid
   my_Grid = WPFControls.Grid()

   #Add 1 Row and One Column
   my_Grid.RowDefinitions.Add(WPFControls.RowDefinition())
   my_Grid.ColumnDefinitions.Add(WPFControls.ColumnDefinition())

   # Create a DataGrid
   myDataGrid = WPFControls.DataGrid()

   #Create three columns
   column_1 = WPFControls.DataGridTextColumn()
   column_1.Header = "ID"
   column_1.Binding = WPFBindings.Binding("id")

   column_2 = WPFControls.DataGridTextColumn()
   column_2.Header = "Title"
   column_2.Binding = WPFBindings.Binding("title")

   column_3 = WPFControls.DataGridTextColumn()
   column_3.Header = "Content"
   column_3.Binding = WPFBindings.Binding("content")

   #Add the three columns to the datagrid
   myDataGrid.Columns.Add(column_1)
   myDataGrid.Columns.Add(column_2)
   myDataGrid.Columns.Add(column_3)

# Data table approach....  
# Fails with
#  AttributeError : DataTable

   #Create a DataTable
   data_table = WPFBindings.DataTable("MyDataTable")
   data_table.Columns.Add("id")
   data_table.Columns.Add("title")
   data_table.Columns.Add("content")

   #Add data 
   data_table.Rows.Add("Andre", "Piratas", "1973")
   data_table.Rows.Add("Andres", "Piratass", "1973s")

   #DataTable to DataGrid
   myDataGrid.DataContext = data_table.DefaultView   


# Item Source Approach   
# Fails with 
#  TypeError: 'list' value cannot be converted to System.Collections.IEnumerable  
#   items = []

#   items.append(Student(id="1", title="Piratas", content="1973"))
#   items.append(Student(id="2", title="XXXX", content="1974"))  

#   myDataGrid.ItemsSource = items


# Items.Add approach
# Fails with 
#  TypeError: No method matches given arguments

#   myDataGrid.Items.Add(Student(id="1", title="Piratas", content="1973"))  



   # Position the DataGrid in the first row, column of the Grid
   WPFControls.Grid.SetRow(myDataGrid, 0)
   WPFControls.Grid.SetColumn(myDataGrid, 0)

   #Add the DataGrid to the Grid 
   my_Grid.Children.Add(myDataGrid)


   # Return the Grid   
   return my_Grid

【问题讨论】:

    标签: python .net wpf data-binding python.net


    【解决方案1】:

    好的,

    我明白了 - 我对 DataTable 的导入有误。 改变了

    "import System.Windows.Data as WPFBindings"
    

    "import System.Data as WPFData"
    

    然后听从了哈马斯的建议,改变了,

    "myDataGrid.DataContext = data_table.DefaultView" 
    

    myDataGrid.ItemsSource= data_table.DefaultView 
    

    感谢哈马斯!!

    【讨论】:

      【解决方案2】:

      为了完整起见,这里是工作代码。 请注意,通过使用 DataTable,我能够删除所有手动列、标题和绑定设置

      import clr
      
      #.NET references
      import System.Windows.Controls as WPFControls
      import System.Data as WPFData
      
      def getCustomToolPropertyContent():
      
         #Create a Grid
         my_Grid = WPFControls.Grid()
      
         #Add 1 Row and One Column
         my_Grid.RowDefinitions.Add(WPFControls.RowDefinition())
         my_Grid.ColumnDefinitions.Add(WPFControls.ColumnDefinition())
      
         # Create a DataGrid
         myDataGrid = WPFControls.DataGrid()
      
      # Data table approach....  
         #Create a DataTable
         data_table = WPFData.DataTable("MyDataTable")
         data_table.Columns.Add("ID")
         data_table.Columns.Add("Title")
         data_table.Columns.Add("Content")
      
         #Add data 
         data_table.Rows.Add("Andre", "Piratas", "1973")
         data_table.Rows.Add("Andres", "Piratass", "1973s")
      
         myDataGrid.ItemsSource = data_table.DefaultView     
      
         # Position the DataGrid in the first row, column of the Grid
         WPFControls.Grid.SetRow(myDataGrid, 0)
         WPFControls.Grid.SetColumn(myDataGrid, 0)
      
         #Add the DataGrid to the Grid 
         my_Grid.Children.Add(myDataGrid)
      
         # Return the Grid   
         return my_Grid
      

      【讨论】:

        【解决方案3】:

        我没有看到你创建 data_Table 实例。

        DataTable data_table = CreateDataTable();
        

        另外试试这个!

        myDataGrid.ItemsSource = data_table.DefaultView;
        

        在 XAML 中

        <DataGrid Name="myDataGrid" ItemsSource="{Binding}">
        

        【讨论】:

        • 这是 Python,因此“data_table = WPFBindings.DataTable("MyDataTable")" 行创建了 DataTable。我尝试从“DataSource”切换到 ItemsSource - 同样的错误
        • # AttributeError : DataTable
        • 阅读这篇文章。它会对你有帮助airbrake.io/blog/python-exception-handling/attributeerror
        • 好吧!很高兴你得到它:) 堆栈溢出的感谢被接受为答案或投票:) 保持祝福
        猜你喜欢
        • 1970-01-01
        • 2019-09-07
        • 1970-01-01
        • 2011-09-24
        • 1970-01-01
        • 1970-01-01
        • 2011-03-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多