我有以下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())
也失败了
我非常厌倦,我不敢相信它非常非常努力
答案 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()