我的问题可能看似重复,因为StackOverflow中有类似的问题,如
但我找不到与我的要求有关的答案。
我动态生成WPF数据网格,它根据特定条件从元数据文件(excel)中获取列。 datagrid需要是通用的,因此我无法在创建过程中绑定Datagrid本身。我动态绑定DatagridCombobobox列,并且能够获取它们中的值。
现在我的问题是,一旦我在DatagridCombobobox中选择一个值或在DatagridTextboxColumn中输入文本然后移动到另一个单元格/行,此文本和选择就会消失。
如何启用Datagrid单元格/行以动态记住我输入的文本或选择? 我在DataGridComboBoxColumn cell not displaying selected item text?中检查了类似问题的答案,但它是针对静态数据网格的。由于我的数据网格创建是动态的,我不知道如何使用此解决方案。请帮助。 我被困在这里并且花了很多时间:(
此致 NIRANJAN。
动态DataGrid创建:
Dim setupGrid = "<my:DataGrid AutoGenerateColumns='False' Name='grdSetup' " & "xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'" & " xmlns:sdk = 'http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk'" & " xmlns:x = 'http://schemas.microsoft.com/winfx/2006/xaml'" & " xmlns:TAB = 'http://fabtab.codeplex.com'" & " xmlns:my='http://schemas.microsoft.com/wpf/2008/toolkit' " & " >"
setupGrid = setupGrid & "<my:DataGrid.Columns>"
...
...
...
setupGrid = setupGrid & "</my:DataGrid.Columns>"
setupGrid = setupGrid & "</my:DataGrid>"
Dim sr = New MemoryStream(Encoding.ASCII.GetBytes(setupGrid))
Dim pc = New ParserContext()
pc.XmlnsDictionary.Add("", "http://schemas.microsoft.com/winfx/2006/xaml/presentation")
pc.XmlnsDictionary.Add("x", "http://schemas.microsoft.com/winfx/2006/xaml")
Dim grdElement As UIElement = DirectCast(System.Windows.Markup.XamlReader.Load(sr, pc), UIElement)
Dim grdSetup As DataGrid = DirectCast(grdElement, DataGrid)
我的DataGridCombobox代码类似:
setupGrid = setupGrid & "<my:DataGridComboBoxColumn x:Name='" & dr.Item("ParameterName").ToString.Trim & "' Header='" & dr.Item("ParameterName") & "' SelectedValuePath='" & dr.Item("ValueColumn") & "' DisplayMemberPath='" & dr.Item("DisplayColumn") & "' />"
此字符串值将添加到上面的DataGrid字符串中并转换为UIElement,如上面的DataGrid代码所示。我动态地将Datagrid添加到ItemsControl:
Me.DynamicContent.Items.Add(grdElement)
其中DynamicContent是ItemsControl。
在UserControl_Loaded事件中,我通过Datagrid找到每个ComboBox:
Dim dynamicGrid as DataGrid = DynamicContent.ItemContainerGenerator.ContainerFromIndex(0)
Dim comboColumns = dynamicGrid.Columns.OfType(Of DataGridComboBoxColumn)()
For index As Integer = 0 To comboColumns.Count - 1
comboColumns(index).ItemsSource = DirectCast(dt, IListSource).GetList()
Next
其中dt是一个数据表,它由要存储到我的ComboBox的数据组成。它将组合框的SelectedValuePath和DisplayMember路径作为列。
我不能事先为DatagridComboboxColumn设置SelectedItemBinding和SelectedValueBinding,因为它是动态的,并且因不同的ComboColumns而异。我不知道如何在上面加载的事件中设置这些。 请告诉我我做错了什么?或者可以做什么,以便即使在焦点丢失后我也能够保留这些值。 对不起,冗长的描述:(