DataGrid mit einer Spalte deren Wert als enum definiert ist
-
Sonntag, 4. März 2012 14:44
Hallo,
ich habe ein DataGrid das an eine DataTable gebunden ist. Diese DataTable hat zwei Spalten
- Sex
- Name
Der Wert für Sex ist in der DataTable als int enthalten aber eigentlich´durch ein enum festgelegt
public enum ContactSex { Hr, Fr }Meine XAML Definition sieht folgendermaßen aus
<DataGrid AutoGenerateColumns="False" VerticalAlignment="Stretch" Name="contactTab" Width="420" ItemsSource="{Binding}" SelectionMode="Single" SelectionChanged="OnSelected"> <DataGrid.Columns> <DataGridTextColumn Header="Anrede" IsReadOnly="True" Binding="{Binding Path=Sex}" > </DataGridTextColumn> <DataGridTextColumn Header="Name" IsReadOnly="True" Binding="{Binding Path=Name}"> </DataGridTextColumn> </DataGrid.Columns> </DataGrid>Mit dieser Definition wird im Datagrid der int Wert in der Anrede Spalte angezeigt - was nicht verwunderlich ist.
Ich habe dann versucht mit einer DataGridComboBoxColumn den enum Wert als Hr oder Fr anzuzeigen.
<DataGridComboBoxColumn SelectedItemBinding="{Binding Path=Sex}" ItemsSource="{Binding Source=DatabaseAccess.ContactSex}"></DataGridComboBoxColumn>Mit dieser geänderten Definition ist eine leere Spalte angezeigt worden. Was mache ich hier falsch?
Vielen Dank
Walter
Walter Taus
Alle Antworten
-
Sonntag, 4. März 2012 19:57
Hier mal ein Beispiel, wie man das mit einem ObjectDataProvider machen kann:
XAML:
<Window x:Class="MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525" xmlns:sys="clr-namespace:System;assembly=mscorlib" xmlns:local="clr-namespace:WpfApplication1"> <Window.Resources> <local:ViewModel x:Key="vm" /> <ObjectDataProvider MethodName="GetValues" ObjectType="{x:Type sys:Enum}" x:Key="EnumValues"> <ObjectDataProvider.MethodParameters> <x:Type TypeName="local:ContactSex" /> </ObjectDataProvider.MethodParameters> </ObjectDataProvider> </Window.Resources> <StackPanel DataContext="{StaticResource vm}"> <DataGrid ItemsSource="{Binding Daten}" AutoGenerateColumns="False"> <DataGrid.Columns> <DataGridComboBoxColumn Header="Anrede" SelectedItemBinding="{Binding Sex}" ItemsSource="{Binding Source={StaticResource EnumValues}}"/> <DataGridTextColumn Header="Name" Binding="{Binding Name}"/> </DataGrid.Columns> </DataGrid> </StackPanel> </Window>
Dazu der ViewModel und die weiteren Klassen:
Imports System.ComponentModel Imports System.Collections.ObjectModel Public Class ViewModel Dim cvs As CollectionViewSource Public ReadOnly Property Daten As ICollectionView Get If cvs Is Nothing Then cvs = New CollectionViewSource With {.Source = GetData()} Return cvs.View End Get End Property Private Function GetData() As ObservableCollection(Of Data) Dim rnd As New Random Dim l As New ObservableCollection(Of Data) For i = 1 To 9 l.Add(New Data With {.Sex = rnd.Next(2), .Name = "Name " & i.ToString}) Next Return l End Function End Class Public Class Data Public Property Sex As ContactSex Public Property Name As String End Class Public Enum ContactSex Hr = 0 Fr = 1 End Enum
--
Viele Gruesse
Peter- Als Antwort vorgeschlagen Peter FleischerMVP Dienstag, 6. März 2012 12:08
- Als Antwort markiert WalterTaus Dienstag, 6. März 2012 20:16
-
Dienstag, 6. März 2012 20:16
Hallo Peter,
es funktioiert - vielen Dank.
Meine XAML Definition sieht jetzt wie folgt aus
<Window x:Class="DataGrid5T.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:sys="clr-namespace:System;assembly=mscorlib" xmlns:local="clr-namespace:DataGrid5T" Title="DataGrid5T" Height="350" Width="525"> <Window.Resources> <ObjectDataProvider MethodName="GetValues" ObjectType="{x:Type sys:Enum}" x:Key="EnumValues"> <ObjectDataProvider.MethodParameters> <x:Type TypeName="local:Sex" /> </ObjectDataProvider.MethodParameters> </ObjectDataProvider> </Window.Resources> <StackPanel Orientation="Vertical"> <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding}" Height="287" Name="dataGrid1" Width="469" > <DataGrid.Columns> <DataGridComboBoxColumn Header="Anrede" SelectedItemBinding="{Binding Anrede}" ItemsSource="{Binding Source={StaticResource EnumValues}}"/> <DataGridTextColumn Header="Name" Binding="{Binding Name}"/> </DataGrid.Columns> </DataGrid> </StackPanel> </Window>
Dazu noch der code behindpublic partial class MainWindow : Window { public MainWindow() { InitializeComponent(); List<Person> pl = new List<Person>(); pl.Add(new Person(){Anrede=Sex.Fr, Name="Romanowa"}); pl.Add(new Person() { Anrede = Sex.Hr, Name = "Dr Jekyll" }); pl.Add(new Person() { Anrede = Sex.Hr, Name = "Hyde" }); dataGrid1.DataContext = pl; } } public class Person { public Sex Anrede { get; set; } public string Name { get; set; } } public enum Sex { Hr, Fr }
Walter Taus
- Als Antwort markiert WalterTaus Dienstag, 6. März 2012 20:16

