У меня есть следующий 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")
Обновлено еще раз: Теперь я пытаюсь использовать событие 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())
это тоже не удается
Я очень устал, я не могу поверить, что это так сложно
Я сдаюсь - пока, может быть, кто-то не протянет руку
В этой статье говорится: «Мы не можем получить доступ к элементам управления DataTemplate в исходном коде», поэтому я собираюсь потратить некоторое время на то, чтобы понять, как это сделать с помощью модели представления, как я думаю. codeproject.com/Questions/804507/…
Эта статья (хотя я ее еще не понимаю) выглядит многообещающей gui-at.blogspot.co.uk/2009/11/…





Перепробовав множество идей и пройдя курс обучения 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()
Кто-нибудь есть - см. Правки