我尝试在我的datagrid组合框列中进行枚举,但是按名称对其进行排序,并且仍然能够将所选选项绑定到作为网格源的对象。
我尝试了两种不同的方法来实现这一目标。
枚举声明
public enum Animals
Zebra
Antelope
Ox
Mouse
End Enum
XAML枚举参考
xmlns:obj="clr-namespace:SMS_Obj.Enumerations;assembly=SMS_Obj"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"
<CollectionViewSource x:Key="AnimalEnum">
<CollectionViewSource.SortDescriptions>
<scm:SortDescription />
</CollectionViewSource.SortDescriptions>
<CollectionViewSource.Source>
<ObjectDataProvider MethodName="GetNames" ObjectType="{x:Type sys:Enum}">
<ObjectDataProvider.MethodParameters>
<x:Type TypeName="obj:Animals" />
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
</CollectionViewSource.Source>
</CollectionViewSource>
对象设置为网格的ItemsSource
列表
Public Class clsAnimals
Private _AnimalID As SMS_Obj.Enumerations.Animals
Public Property AnimalID() As SMS_Obj.Enumerations.Animals
Get
Return _AnimalID
End Get
Set(ByVal value As SMS_Obj.Enumerations.Animals)
_AnimalID = value
End Set
End Property
End Class
尝试1
<DataGridComboBoxColumn x:Name="dgcAnimalName" Header="Animal Name" Width="*" SelectedValueBinding="{Binding Path=AnimalID, UpdateSourceTrigger=PropertyChanged}" ItemsSource="{Binding Source={StaticResource AnimalEnum},Mode=OneWay}" />
尝试2
<DataGridTemplateColumn x:Name="dgcAnimalName" Header="Animal Name" Width="*">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox DataContext="{StaticResource AnimalEnum}" SelectedValuePath="{Binding Path=AnimalsID, UpdateSourceTrigger=PropertyChanged}" ItemsSource="{Binding}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox DataContext="{StaticResource AnimalEnum}" SelectedValuePath="{Binding Path=AnimalID, UpdateSourceTrigger=PropertyChanged}" ItemsSource="{Binding}"/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
两次尝试都正确绑定枚举但我丢失了对象上的值和任何新值。我认为有些东西是我遗漏的,因为我之前从未在XAML中使用过排序的Enum。
先谢谢你
答案 0 :(得分:0)
它不是绑定的原因是因为GetNames调用,使SelectedValue
成为字符串而不是整数。我可以通过将对象更改为
Private _AnimalID As SMS_Obj.Enumerations.Animals
Public Property AnimalID() As SMS_Obj.Enumerations.Animals
Get
Return _AnimalID
End Get
Set(ByVal value As SMS_Obj.Enumerations.Animals)
_AnimalID = value
If _TableName <> [Enum].GetName(GetType(SMS_Obj.Enumerations.Animals), _AnimalID ) Then
_TableName = [Enum].GetName(GetType(SMS_Obj.Enumerations.Animals), _AnimalID )
End If
End Set
End Property
Private _AnimalName As String
Public Property AnimalName() As String
Get
Return _AnimalName
End Get
Set(ByVal value As String)
_AnimalName = value
If _AnimalID <> [Enum].Parse(GetType(SMS_Obj.Enumerations.Animals), _AnimalName) Then
_AnimalID = [Enum].Parse(GetType(SMS_Obj.Enumerations.Animals), _AnimalName)
End If
End Set
End Property
与此相关:
<DataGridComboBoxColumn x:Name="dgcAnimalName" Header="Animal Name" Width="*" SelectedValueBinding="{Binding Path=AnimalName, UpdateSourceTrigger=PropertyChanged}" ItemsSource="{Binding Source={StaticResource AnimalEnum},Mode=OneWay}" />