none
DataGridComboBoxColumn Binden RRS feed

  • Frage

  • Hallo,

    ich habe arge Probleme, mein DataGrid zu binden. Ich nutze als Datenobjekt ein DataTable. In dieser möchte ich aber nur den nummerischen Wert sichern.

    Ob das nun über Autogenerierung oder nicht geschieht, ist mir fast egal. Am liebsten wäre mir aber eine Autogenerierung.

    Meine Enum habe ich als ObjectDataProvider bereit gestellt.

    <ObjectDataProvider MethodName="GetValues" ObjectType="{x:Type sys:Enum}" x:Key="GetEnumValues">
                <ObjectDataProvider.MethodParameters>
                    <x:Type TypeName="model:FileWatcherTypeEnum"/>
                </ObjectDataProvider.MethodParameters>
            </ObjectDataProvider>

    Jetzt möchte ich mein DataGrid binden.

     <DataGrid ItemsSource="{Binding SettingView.View}"
                          SelectedItem="{Binding SelectedSetting}"
                          Background="{StaticResource TabControl_BackgroundBrush_Base}" 
                          Margin="5"
                          AutoGenerateColumns="False">
                    <DataGridComboBoxColumn Header="Typ" 
                                            SelectedItemBinding="{Binding Type}" ItemsSource="{Binding Source={StaticResource GetEnumValues}}"
                                              />
    
                </DataGrid>

    Und hier noch das Enum

        public enum FileWatcherTypeEnum {Lokal=0, Remote=1}

    Montag, 22. Juni 2015 12:15

Antworten

  • Hi,
    so geht das nicht. "GetValues" liefert nur die Bezeichner der Aufzählung als Array von Objekten. Wenn Du die intern genutzten Werte als korrespondierenden Wert haben willst, um "SelectedValue" anstelle "DisplayName" in den Datensatz zu zuschreiben, musst Du eine Liste mit entsprechenden Objekten (ggf. reicht anonym) erzeugen und binden.

    Wenn die Spalte vom Typ der Enum ist, dann kann man auch ohne SelectedValue arbeiten.

    Hier mal eine Demo, wie man das machen kann:

    XAML:

    <Window x:Class="WpfApplication1.Window16"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="Window16" Height="300" Width="300"
            xmlns:local="clr-namespace:WpfApplication1">
      <Window.Resources>
        <ObjectDataProvider MethodName="GetValues" ObjectType="{x:Type local:Helper}" x:Key="GetEnumValues"/>
      </Window.Resources>
        <StackPanel>
        <ComboBox Name="cb" ItemsSource="{Binding Source={StaticResource GetEnumValues}}" 
                  VerticalAlignment="Top" DisplayMemberPath="Name" SelectedValuePath="Value"/>
        <TextBox Text="{Binding ElementName=cb, Path=SelectedValue}"/>
      </StackPanel>
    </Window>

    Code:

    using System;
    using System.Collections.Generic;
    using System.Windows;
    using System.Windows.Documents;
    
    namespace WpfApplication1
    {
      /// <summary>
      /// Interaction logic for Window16.xaml
      /// </summary>
      public partial class Window16 : Window
      {
        public Window16()
        {
          InitializeComponent();
        }
      }
      public enum FileWatcherTypeEnum { Lokal = 3, Remote = 1 }
    
      public class Helper
      {
        public List<HelperItem> GetValues()
        {
          List<HelperItem> liste = new List<HelperItem>();
          foreach (FileWatcherTypeEnum item in Enum.GetValues(typeof(FileWatcherTypeEnum)))
          {
            liste.Add(new HelperItem { Value = (int)item, Name = item.ToString() });
          }
          return liste;
        }
      }
      public class HelperItem
      {
        public int Value { get; set; }
        public string Name { get; set; }
      }
    }


    --
    Viele Grüsse
    Peter Fleischer (MVP, Partner)
    Meine Homepage mit Tipps und Tricks



    Dienstag, 23. Juni 2015 16:47

Alle Antworten

  • Hallo UrielMhezzek,

    Bekommst Du einen Fehler? Oder es erscheinen keine Daten im DataGrid?

    Gruß,
    Dimitar


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Dienstag, 23. Juni 2015 12:09
    Moderator
  • Hi,
    so geht das nicht. "GetValues" liefert nur die Bezeichner der Aufzählung als Array von Objekten. Wenn Du die intern genutzten Werte als korrespondierenden Wert haben willst, um "SelectedValue" anstelle "DisplayName" in den Datensatz zu zuschreiben, musst Du eine Liste mit entsprechenden Objekten (ggf. reicht anonym) erzeugen und binden.

    Wenn die Spalte vom Typ der Enum ist, dann kann man auch ohne SelectedValue arbeiten.

    Hier mal eine Demo, wie man das machen kann:

    XAML:

    <Window x:Class="WpfApplication1.Window16"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="Window16" Height="300" Width="300"
            xmlns:local="clr-namespace:WpfApplication1">
      <Window.Resources>
        <ObjectDataProvider MethodName="GetValues" ObjectType="{x:Type local:Helper}" x:Key="GetEnumValues"/>
      </Window.Resources>
        <StackPanel>
        <ComboBox Name="cb" ItemsSource="{Binding Source={StaticResource GetEnumValues}}" 
                  VerticalAlignment="Top" DisplayMemberPath="Name" SelectedValuePath="Value"/>
        <TextBox Text="{Binding ElementName=cb, Path=SelectedValue}"/>
      </StackPanel>
    </Window>

    Code:

    using System;
    using System.Collections.Generic;
    using System.Windows;
    using System.Windows.Documents;
    
    namespace WpfApplication1
    {
      /// <summary>
      /// Interaction logic for Window16.xaml
      /// </summary>
      public partial class Window16 : Window
      {
        public Window16()
        {
          InitializeComponent();
        }
      }
      public enum FileWatcherTypeEnum { Lokal = 3, Remote = 1 }
    
      public class Helper
      {
        public List<HelperItem> GetValues()
        {
          List<HelperItem> liste = new List<HelperItem>();
          foreach (FileWatcherTypeEnum item in Enum.GetValues(typeof(FileWatcherTypeEnum)))
          {
            liste.Add(new HelperItem { Value = (int)item, Name = item.ToString() });
          }
          return liste;
        }
      }
      public class HelperItem
      {
        public int Value { get; set; }
        public string Name { get; set; }
      }
    }


    --
    Viele Grüsse
    Peter Fleischer (MVP, Partner)
    Meine Homepage mit Tipps und Tricks



    Dienstag, 23. Juni 2015 16:47