Вот как должен выглядеть этот комбобокс, я думаю.Свойство x: Name не требуется.Сомневаюсь, что IsEditable тоже нужен.
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox
IsEditable="True"
SelectedValuePath="Status"
DisplayMemberPath="Description"
SelectedValue="{Binding Status}"
/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
SelectedValuePath
и DisplayMemberPath
являются строками.Это имена столбцов в строках данных, которые заполняют ComboBox
(если вы заполните его обычными экземплярами класса C #, они вместо этого будут именами свойств класса элемента).Вы пытались привязать эти свойства к свойствам модели представления, которой у вас нет, но даже если бы она у вас была, у них не было бы этих свойств.Но понятие о том, что такое связывание и что оно делает, может поначалу быть странно скользким.
Я почти сказал вам прочитать документацию по SelectedValuePath , но документация была пересмотрена и теперь по сути бессмысленна. DisplayMemberPath лучше .
Второе: у вас должна быть модель представления.Отсутствие модели представления усложняет все.Но у вас нет модели представления.
То, что вам нужно сделать, это получить то, что вы хотите из базы данных, и поместить его в какую-то коллекцию где-нибудь, с чем может быть связан комбобокс.
Если у нас нет модели представления, которая могла бы служить естественным домом для этой коллекции, мы сделаем это, создав CollectionViewSource в ресурсах вашего окна.
<Window
x:Class="blah blah"
...stuff...
>
<Window.Resources>
<CollectionViewSource
x:Key="StatusItems"
/>
</Window.Resources>
И мы воспользуемся этим для заполнения комбинированного списка следующим образом:
<ComboBox
x:Name="StatusCombo"
SelectedValuePath="Status"
DisplayMemberPath="Description"
ItemsSource="{Binding Source={StaticResource StatusItems}}"
/>
Но наш CollectionViewSource пуст.Так что нам придется как-то его заселить.Мы будем делать это всякий раз, когда вы выполняете запрос к базе данных.
Dim statusCVS As CollectionViewSource = FindResource("StatusItems")
Dim com2 As String = "SELECT * FROM tmfCNCComponentStatus_threed"
Dim AdptStatus As New SqlDataAdapter(com2, con)
AdptStatus.Fill(ds, "dbo.tmfCNCComponentStatus_threed")
Dim statusRows = ds.Tables("dbo.tmfCNCComponentStatus_threed").Rows
Dim statuses As New List(Of Object)
For Each row As DataRow In statusRows
statuses.Add(New With {
.Status = CInt(row("CNCComponentStatusKey")),
.Description = CStr(row("Description"))
})
Next
statusCVS.Source = statuses
Это было бы лучше, чем цикл, если он работает:
Dim statuses = From row In ds.Tables("dbo.tmfCNCComponentStatus_threed")
.Rows.Cast(Of DataRow)
Select New With {
.Status = CInt(row("CNCComponentStatusKey")),
.Description = CStr(row("Description"))
}
statusCVS.Source = statuses
ОК, теперь у нас есть эта часть:
SelectedValue="{Binding Status}"
Япредполагая, что test_3DimensionalDB
(действительно ли заполнена ваша DataGrid?) должен иметь некоторый столбец, который является внешним ключом к значению идентификатора состояния в комбо, и я предполагаю, что он может называться Status
.
Итак, что мы хотим сделать, это: скажем, у вас есть два элемента:
item 0:
Status = 1
Description = Dog
item 1:
Status = 2
Description = Cat
DisplayMemberPath="Description"
означает, что элемент 0 будет отображаться как «Собака», значение его свойства Description,Элемент 1 будет отображаться как «Кошка» по той же причине.
SelectedValuePath="Status"
означает, что когда привязка устанавливает SelectedValue в 2
, комбинированный список просматривает свою коллекцию элементов, чтобы найти элемент со свойством Status
, равным 2
, и выбирает этот элемент.,Если мы установим SelectedValuePath="Fred"
, он будет искать элемент со свойством с именем Fred
, равным 2
.
Аналогично, если пользователь сам изменяет выбор, он идет другим путем: скажем, пользователь выбирает элемент 0, поэтому ComboBox обращается к своему собственному SelectedValuePath
, видит «Status» и получает Status
значение свойства (если есть) выбранного элемента.Для пункта 0 это 1
.Затем комбинированный список присваивает это значение 1
своему собственному свойству SelectedValue
.
Привязка к SelectedValue
получит уведомление об изменении SelectedValue
, получит новое значение и обновит столбец строки базы данных, к которой она привязана (в данном случае также называется «Статус»).).
Binding
- это объект, который торчит и делает вещи.Это не модное слово для «назначения».
SelectedValue="{Binding Status}"