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

时间:2018-03-13 17:40:26

标签: xaml listview combobox ironpython inotifycollectionchanged

我有以下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属性,但经过几天的努力我失败了。

我是IronPython的新手并感谢您的帮助。

修改 我尝试了很多方法来获取对组合的引用而没有成功。

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

无法从文本'ComboBox_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())

也失败了

我非常厌倦,我不敢相信它非常非常努力

1 个答案:

答案 0 :(得分:1)

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

当我尝试将组合框绑定到铁蟒类中的阵列时,第一个突破来了。它只是想我会试着看它有效!

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>

IronPython类:

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 Server):

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()

enter image description here