我想这个组合框最终应该是这样的。不需要x:Name属性。我也怀疑是否需要IsEditable。
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox
IsEditable="True"
SelectedValuePath="Status"
DisplayMemberPath="Description"
SelectedValue="{Binding Status}"
/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
SelectedValuePath
和
DisplayMemberPath
是字符串。它们是填充
ComboBox
(如果使用常规C#类实例填充,则它们将成为item类的属性名称)。您试图将这些属性绑定到您没有的viewmodel的属性,但即使您有一个viewmodel,它也不会有这些属性。但是,绑定是什么以及它的作用的概念一开始可能会非常棘手。
我差点告诉你
read the documentation on SelectedValuePath
,但文件已经修改,现在基本上没有意义了。
DisplayMemberPath is better
。
第二:您应该有一个viewmodel。缺少viewmodel使一切变得更加困难。但您没有viewmodel。
您需要做的是从数据库中获取所需内容,并将其放入某种集合中,以便组合框可以绑定到其中。
由于缺少viewmodel作为该集合的自然家园,我们将通过在窗口的资源中创建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是否正在实际填充?)必须有一个列,它是组合中状态id值的外键,我猜它可能会被调用
Status
。
所以我们想做的是:假设你有两个项目:
item 0:
Status = 1
Description = Dog
item 1:
Status = 2
Description = Cat
DisplayMemberPath="Description"
表示项目0将显示为“Dog”,即其Description属性的值。出于同样的原因,项目1将显示为“Cat”。
SelectedValuePath="Status"
意味着当绑定将SelectedValue设置为
2
,组合框将查看其items集合,以找到具有
地位
属性等于
2.
,然后选择该项目。如果我们设置
SelectedValuePath="Fred"
,它将查找具有名为
Fred
2.
。
同样,如果用户自己更改了选择,则会转到另一个方向:假设用户选择了项0,因此组合框会参考自己的
SelectedValuePath
,查看“状态”,并获取
地位
所选项目的属性值(如果有)。对于项目0,这是
1
。然后组合框将为
1.
自己的
SelectedValue
所有物
上的绑定
选定值
然后将收到通知
选定值
已更改,它将获取新值并更新绑定到的数据库行列(在本例中也称为“Status”)。
这个
Binding
是一个粘在周围做事情的物体。这不是“任务”的花哨词。
SelectedValue="{Binding Status}"