如何使用 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()
我有以下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()