当焦点丢失时,不显示在WPF DatagridTextboxColumn中输入的文本和在DatagridComboboxColumn中选择的值

时间:2011-11-17 08:36:01

标签: wpf vb.net dynamic wpfdatagrid

我的问题可能看似重复,因为StackOverflow中有类似的问题,如

https://stackoverflow.com/questions/5733782/how-to-retain-value-in-datagridcomboboxcolumn-of-wpfs-datagrid

https://stackoverflow.com/questions/6101441/creating-wpf-datagrid-dynamically-with-dynamically-created-drop-down-box-using-d

但我找不到与我的要求有关的答案。

我动态生成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而异。我不知道如何在上面加载的事件中设置这些。 请告诉我我做错了什么?或者可以做什么,以便即使在焦点丢失后我也能够保留这些值。 对不起,冗长的描述:(

0 个答案:

没有答案