Мой вопрос может показаться повторяющимся, поскольку в StackOverflow есть похожие вопросы, например:
но я не нашел ответа на мои требования.
Я динамически создаю сетку данных WPF, которая берет столбцы из файла метаданных (excel) на основе определенных условий. Сетка данных должна быть универсальной, и поэтому я не могу привязать саму сетку данных во время создания. Я динамически привязываю столбцы DatagridCombobobox и также могу получить в них значения.
Теперь моя проблема заключается в том, что как только я выбираю значение в DatagridCombobobox или ввожу текст в DatagridTextboxColumn, а затем перехожу к другой ячейке/строке, этот текст и выделение исчезают.
Как включить ячейку/строку Datagrid для динамического запоминания введенного текста или выделения? Я проверил ответ на аналогичный вопрос в ячейке DataGridComboBoxColumn, не отображающей текст выбранного элемента. ? но это для статической сетки данных. Поскольку мое создание сетки данных является динамическим, я не знаю, как использовать это решение. Пожалуйста, помогите. Я застрял в этом, и это занимает много моего времени :(
С уважением, Ниранджан.
Динамическое создание 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 я нахожу каждый 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 - это Datatable, который состоит из данных, которые должны быть в моем ComboBox. Он имеет путь SelectedValuePath и DisplayMember поля со списком в качестве столбцов.
Я не могу заранее установить SelectedItemBinding и SelectedValueBinding для DatagridComboboxColumn, поскольку он является динамическим и различается для разных ComboColumns. Я не знаю, как их можно установить в загруженном выше событии. Пожалуйста, дайте мне знать, что я делаю неправильно? Или что можно сделать, чтобы я мог сохранить значения даже после потери фокуса. Извините за длинное описание :(
SelectedItem
, ниSelectedIndex
, ниSelectedValue
, поэтому ваш выбор не сохраняется. - person Rachel   schedule 17.11.2011