Respondido DataGrid mit einer Spalte deren Wert als enum definiert ist

  • Sonntag, 4. März 2012 14:44
     
      Enthält Code

    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
     
     Beantwortet

    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
     
     Beantwortet Enthält Code

    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 behind
        public 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
    •