none
SelectedValue binding ComboBox RRS feed

  • Frage

  • Hallo Zusammen

    Kann mir bitte jemand helfen. Ich versuche gerade per Code eine Combobox zu generieren bei der das SelectedValue auf eine Variable verweist, d.h. das Steuerelement Combobox besitz eine Tabelle als DataSource wobei die ID das Value und der Text (Spalte 2) den Content. Wenn jetzt nun eine Auswahl getätigt wird soll die ID bzw. das Value in einer Variable in einer anderen Klasse gespeichert werden.

    Hier noch mein Code. Ich habe das Gefühl, der Ansatz stimmt schon mal :)

    MainWindows.xaml.cs

    // Klasse TitleList beinhaltet das DataTable
    var titlelist = new TitleList();
    titlelist.GetTitles();
    
    // Zuweisen der DataTable. Mit Title als Anzeigetext und ID als Value
    var Combobox=new Combobox();
    combobox.ItemsSource = titlelist.tblTitleList.DefaultView;
    combobox.DisplayMemberPath = "Title";
    combobox.SelectedValuePath = "ID";
    
    // Binding erstellen. Das Value soll der Klasse title.ID zugewiesen werden
    Title title=new Title(); combobox.SelectedValue = new Binding() { Source = title, Path = new PropertyPath("ID") };

    Title.cs

    public int ID { get; set; }
    public int _ID
    {
        get { return ID; }
        set { ID = Convert.ToInt32(value.ToString()); }
    }

    Bin sehr dankbar für jede Hilfe.

    Gruss Gezim95


    Gezim

    Montag, 1. Juni 2015 20:20

Antworten

  • Hi Gezim,
    ich denke, Du suchst eine Lösung, wie nachfolgend dargestellt. Wichtig dabei ist das Setzen der Bindung. Ich habe auch alle Steuerelemente im Code hinzugefügt.

    using System.Data;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    
    namespace WpfApplication1
    {
      /// <summary>
      /// Interaction logic for Window13.xaml
      /// </summary>
      public partial class Window13 : Window
      {
        public Window1()
        {
          InitializeComponent();
        }
    
        StackPanel sp = new StackPanel();
        ComboBox cb = new ComboBox();
        Label lbl = new Label();
    
        Title title = new Title();
    
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
          this.Content = sp;
          sp.Children.Add(cb);
          // Klasse TitleList beinhaltet das DataTable
          var titlelist = new TitleList();
          titlelist.GetTitles();
    
          // Zuweisen der DataTable. Mit Title als Anzeigetext und ID als Value
          cb.ItemsSource = titlelist.tblTitleList.DefaultView;
          cb.DisplayMemberPath = "Title";
          cb.SelectedValuePath = "ID";
    
          //// Binding erstellen. Das Value soll der Klasse title.ID zugewiesen werden
          cb.SetBinding(ComboBox.SelectedValueProperty, new Binding() { Source = title, Path = new PropertyPath("ID"), Mode = BindingMode.OneWayToSource });
    
          // Anzeige der Auswahl organisieren
          sp.Children.Add(lbl);
          lbl.SetBinding(Label.ContentProperty, new Binding() { Source = title, Path = new PropertyPath("ID") });
        }
      }
    
      internal class TitleList
      {
        DataTable _dt = null;
        internal void GetTitles()
        {
          _dt = new DataTable();
          _dt.Columns.Add("Title", typeof(string));
          _dt.Columns.Add("ID", typeof(int));
          for (int i = 1; i < 10; i++)
          {
            _dt.Rows.Add(string.Format("Zeile {0}", i), i);
          }
        }
        internal DataTable tblTitleList
        {
          get { return _dt; ; }
        }
      }
      public class Title
      {
        public int ID { get; set; }
      }
    }


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

    • Als Antwort vorgeschlagen Peter Fleischer Dienstag, 2. Juni 2015 08:42
    • Als Antwort markiert Gezim95 Dienstag, 2. Juni 2015 13:17
    Dienstag, 2. Juni 2015 08:41

Alle Antworten

  • Hallo,

    zunächst mal zu deiner ID-Eigenschaft. Das sollte so aussehen:

    private int _ID;
    public int ID{
      get{return _ID;}
      set{_ID = value;}
    }
    Bei der Bindung musst du nun noch die Mode-Eigenschaft auf TwoWay oder OneWayToSource setzen, damit der Wert auch zurück geschrieben wird.


    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    • Als Antwort vorgeschlagen Tobias Scholze Dienstag, 2. Juni 2015 06:18
    Montag, 1. Juni 2015 20:55
    Moderator
  • Hallo Koopakiller

    Dank für die rasche Antwort. Ich habe mal den Vorschlag so umgesetzt, jedoch ohne Erfolg.

    combobox.SelectedValue = new Binding() { Source = title, Path = new PropertyPath("ID"), Mode = BindingMode.OneWayToSource };

    private int _ID
    public int ID { get { return _ID; } set { _ID = value; } }

    Im Debugger besitzt die Variable den Wert 0.


    Gezim

    Dienstag, 2. Juni 2015 07:19
  • Hi Gezim,
    ich denke, Du suchst eine Lösung, wie nachfolgend dargestellt. Wichtig dabei ist das Setzen der Bindung. Ich habe auch alle Steuerelemente im Code hinzugefügt.

    using System.Data;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    
    namespace WpfApplication1
    {
      /// <summary>
      /// Interaction logic for Window13.xaml
      /// </summary>
      public partial class Window13 : Window
      {
        public Window1()
        {
          InitializeComponent();
        }
    
        StackPanel sp = new StackPanel();
        ComboBox cb = new ComboBox();
        Label lbl = new Label();
    
        Title title = new Title();
    
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
          this.Content = sp;
          sp.Children.Add(cb);
          // Klasse TitleList beinhaltet das DataTable
          var titlelist = new TitleList();
          titlelist.GetTitles();
    
          // Zuweisen der DataTable. Mit Title als Anzeigetext und ID als Value
          cb.ItemsSource = titlelist.tblTitleList.DefaultView;
          cb.DisplayMemberPath = "Title";
          cb.SelectedValuePath = "ID";
    
          //// Binding erstellen. Das Value soll der Klasse title.ID zugewiesen werden
          cb.SetBinding(ComboBox.SelectedValueProperty, new Binding() { Source = title, Path = new PropertyPath("ID"), Mode = BindingMode.OneWayToSource });
    
          // Anzeige der Auswahl organisieren
          sp.Children.Add(lbl);
          lbl.SetBinding(Label.ContentProperty, new Binding() { Source = title, Path = new PropertyPath("ID") });
        }
      }
    
      internal class TitleList
      {
        DataTable _dt = null;
        internal void GetTitles()
        {
          _dt = new DataTable();
          _dt.Columns.Add("Title", typeof(string));
          _dt.Columns.Add("ID", typeof(int));
          for (int i = 1; i < 10; i++)
          {
            _dt.Rows.Add(string.Format("Zeile {0}", i), i);
          }
        }
        internal DataTable tblTitleList
        {
          get { return _dt; ; }
        }
      }
      public class Title
      {
        public int ID { get; set; }
      }
    }


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

    • Als Antwort vorgeschlagen Peter Fleischer Dienstag, 2. Juni 2015 08:42
    • Als Antwort markiert Gezim95 Dienstag, 2. Juni 2015 13:17
    Dienstag, 2. Juni 2015 08:41