0

I have the following 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>

The ListView has two columns, in the second column I need a combobox of options.

I have a drag drop event associated with the ListView, when you drag a file onto the list the filenames are dynamically added successfully to the list view.

 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

What I need to do inside that event is to also populate the combobox, which is currently empty.

I have tried to work out how to get a reference to the combobox to be able to set its ItemsSource property, but after days of effort I have failed.

I am new to IronPython and appreciate your help.

EDIT: I tried many ways of getting a reference to the combo without success.

Now I am trying to use the Loaded event, but I get an error :

Failed to create a 'Loaded' from the text '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>

In Iron Python I define the event:

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

EDIT 2: Now I am trying to use the ListView CollectionChanged event

lstViewDropTarget.Items.CollectionChanged += ListView_ItemChanged

And here is the event code

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

That works messagebox shows '1'

So I can access the new item using e.NewItems[0]

But how do I access the controls?!

I try:

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

and that fails to execute so I try:

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

that also fails

I am very fed up, I cant believe its so very very hard

Richard Briggs
  • 423
  • 4
  • 14
  • Anyone there - please see Edits – Richard Briggs Mar 14 '18 at 22:41
  • I give up - until maybe someone can lend a hand – Richard Briggs Mar 14 '18 at 23:19
  • This article states 'We can not access DataTemplate controls in code behind' so I am going to put some time into understanding the correct way to do this using a viewmodel I think. https://www.codeproject.com/Questions/804507/How-to-access-controls-buttons-inside-DataTemplate – Richard Briggs Mar 16 '18 at 10:34
  • This article (although I don't understand it yet) looks promising http://gui-at.blogspot.co.uk/2009/11/inotifypropertychanged-in-ironpython.html – Richard Briggs Mar 16 '18 at 10:52

1 Answers1

1

After trying many ideas and climbing the Iron Python learning curve I have a working solution. Whilst I have switched to a DataGrid, the method I have used would work with a ListView.

The first breakthrough came when I tried to bind the combobox to array within an iron python class. It just thought I would try and behold it worked!

There were further problems with SelectedItem and needing both a CellTemplate and a CellEditingTemplate, otherwise the selected item doesn't show when the combo loses focus.

I am quite pleased with the result, now I can just iterate through the DataGrid Items to save the results.

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

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 = ""

Populating the DataGrid (from 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

Richard Briggs
  • 423
  • 4
  • 14