如何使用 IronPython 和 XAML 将项目添加到组合框

How to add items to a combobox with IronPython and XAML

我有以下XAML

          <ListView  x:Name="listViewTarget" Height="560" Canvas.Left="10" Canvas.Top="101" Width="924" AllowDrop="True">
            <ListView.View>
                <GridView>
                    <GridViewColumn  Width="350" Header="File or Email">

                    </GridViewColumn>
                    <GridViewColumn   Width="500" Header="Awaiting Item" >
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <ComboBox Width="350" x:Name="cboAI" HorizontalAlignment="Right">
                                </ComboBox>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                </GridView>
            </ListView.View>
        </ListView>

ListView 有两列,在第二列中我需要一个选项组合框。

我有一个与 ListView 关联的拖放事件,当您将文件拖到列表中时,文件名会成功动态添加到列表视图中。

 def listView_drag_drop(sender, e):    
     data = e.Data.GetData(DataFormats.FileDrop, False) 
     for s in data:
        sender.Items.Add(s)


lstViewDropTarget = LogicalTreeHelper.FindLogicalNode(_tikitSender,listViewTarget')
lstViewDropTarget.Drop += listView_drag_drop

我需要在该事件中做的是同时填充当前为空的组合框。

我试图弄清楚如何获取组合框的引用以便能够设置其 ItemsSource 属性,但经过几天的努力我还是失败了。

我是 Iron 的新手Python,感谢您的帮助。

编辑: 我尝试了很多方法来获取对组合的引用,但都没有成功。

现在我正在尝试使用 Loaded 事件,但出现错误:

无法从文本 'ComboBox_Loaded'

创建 'Loaded'
      <ListView  x:Name="listViewTarget" Height="560" Canvas.Left="10" Canvas.Top="101" Width="924" AllowDrop="True">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <StackPanel x:Name="test">
                        <Label x:Name="textFileName" Content="ABC" />
                        <TextBlock Text="DEF"/>
                        <ComboBox
                                HorizontalAlignment="Left"
                                Margin="10,10,0,0"
                                VerticalAlignment="Top"
                                Width="120"
                                Loaded="ComboBox_Loaded"/>
                    </StackPanel>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

在 Iron 中 Python 我定义事件:

 def ComboBox_Loaded(sender, e):
    MessageBox.Show("Test")

编辑 2: 现在我正在尝试使用 ListView CollectionChanged 事件

lstViewDropTarget.Items.CollectionChanged += ListView_ItemChanged

这是活动代码

def ListView_ItemChanged(sender, e):
   MessageBox.Show(e.NewItems.Count.ToString())

有效,消息框显示“1”

所以我可以使用 e.NewItems[0]

访问新项目

但是如何访问控件?!

我试试:

MessageBox.Show(e.NewItems[0].Children.Count.ToString())

执行失败 所以我尝试:

MessageBox.Show(e.NewItems[0].Content.Children.Count.ToString())

同样失败

我受够了,我不敢相信它如此非常非常难

在尝试了许多想法并攀登 Iron Python 学习曲线后,我有了一个可行的解决方案。虽然我已切换到 DataGrid,但我使用的方法适用于 ListView。

当我尝试将组合框绑定到铁中的数组时,第一个突破出现了 python class。它只是想我会尝试并看到它有效!

SelectedItem 存在更多问题,同时需要 CellTemplate 和 CellEditingTemplate,否则当组合失去焦点时所选项目不会显示。

我对结果很满意,现在我可以循环访问 DataGrid 项来保存结果。

 <DataGrid x:Name="gridUnknownDocuments" FontFamily="Segoe UI" FontWeight="Normal" FontSize="14" Height="294" Width="904" AutoGenerateColumns="False" SelectionUnit="Cell" Canvas.Left="20" Canvas.Top="39" >
<DataGrid.Columns>
    <DataGridTextColumn Header="StepID" Binding="{Binding StepID}" IsReadOnly="True" />
    <DataGridTextColumn Header="Document name" Binding="{Binding DocName}" IsReadOnly="True" />
    <DataGridTemplateColumn  Header="Awaiting Item">
        <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <TextBlock Margin="2" VerticalAlignment="Center" HorizontalAlignment="Left" Text="{Binding SelectedAwaitingItem, Mode=TwoWay}" Width="Auto" />
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
        <DataGridTemplateColumn.CellEditingTemplate>
            <DataTemplate>
                <ComboBox Height="23" 
                    ItemsSource="{Binding Path= Items}"
                    SelectedValue="{Binding Path=SelectedAwaitingItem, Mode=TwoWay}" Width="Auto">
                </ComboBox>
            </DataTemplate>
        </DataGridTemplateColumn.CellEditingTemplate>

</DataGrid.Columns>

铁PythonClass:

class UnknownDocuments(object):
def __init__(self, StepID, DocName,Items,FromTypes):
  self.StepID = StepID
  self.DocName = DocName
  self.SelectedAwaitingItem = ""
  self.Items = Items
  self.FromTypes=FromTypes
  self.SelectedFromType = ""

填充 DataGrid(来自 SQL 服务器):

def PopUnknownDocuments():
# Populate unknown docs grid
  strSql="EXEC upLean_GetUnknownDocuments  @EntityRef='"+_tikitEntity+"', @MatterNo="+_tikitMatter.ToString()
  gridUnknownDocs = LogicalTreeHelper.FindLogicalNode(_tikitSender, 'gridUnknownDocuments')

  _tikitDbAccess.Open(strSql)
  if _tikitDbAccess._dr is not None:
  dr = _tikitDbAccess._dr
  if dr.HasRows:
    item = []
    while dr.Read():
      if not dr.IsDBNull(0):
        item.append(UnknownDocuments(dr.GetString(0), dr.GetString(1),["NA","Awaiting A","Awaiting B"],["Internal","Client","Other Side"]))
  gridUnknownDocs.ItemsSource = item
dr.Close()