none
wpf Combobox: Wert zur Laufzeit ändern RRS feed

  • Frage

  • Salü alle zusammen

    Ich habe in WPF eine Combobox wie folgt gemacht:

    <ComboBox Name="cbProvider" Grid.Row="0" Grid.Column="1"
                ItemsSource="{Binding Source={StaticResource xMailKonfig}}"
                IsSynchronizedWithCurrentItem="True" DisplayMemberPath="pName" 
                SelectionChanged="cbProvider_SelectionChanged" 
                />
    
    
    cbProvider.SelectedIndex = vWertInt;

    Wenn ich der Combobox der SelectedIndex Eigenschaft einen Wert, z.B. 2 zuweise, weil ich möchte, dass der zweite Wert angezeigt wird, dann bleibt SelectedIndex immer bei -1, dies obwohl vWertInt 2 beinhaltet.

    Was muss ich machen, damit meine Combobox den 2. Eintrag anzeigt?

    Vielen lieben Dank und gute Nacht.

    Freitag, 28. März 2014 20:05

Antworten

  • Hi Sabrina,
    ich habe Deinen Code mal ausgeführt und es funktioniert problemlos. Vermutlich ist bei Dir im Konstruktor die Liste noch nicht verfügbar. Hier mal meine Demo:

    XAML:

    <Window x:Class="WpfApplication1.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:local="clr-namespace:WpfApplication1">
      <Window.Resources>
        <local:ViewModel x:Key="vm"/>
      </Window.Resources>
      <Grid DataContext="{Binding Source={StaticResource vm}}">
          <StackPanel Margin="10">
          <ComboBox Name="cbProvider" Grid.Row="0" Grid.Column="1"
                ItemsSource="{Binding xMailKonfig}"
                IsSynchronizedWithCurrentItem="True" DisplayMemberPath="pName" 
                    SelectedIndex="{Binding Index}"/>
    
        </StackPanel>
      </Grid>
    </Window>
    

    Dazu der ViewModel:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Windows;
    using WpfApplication1.Properties;
    
    namespace WpfApplication1
    {
      class ViewModel : INotifyPropertyChanged
      {
        public ViewModel()
        {
          Settings mySetting = new Settings();
          string vWertStr = mySetting.StandardMailID;  // vWert wird mit 2 belegt wenn ich den zweiten Eintrag gewählt hatte.
          _index = Convert.ToInt32(vWertStr);
          //
          xMailKonfig = new List<Data>();
          for (int i = 0; i < 10; i++)
          {
            xMailKonfig.Add(new Data() { pName = "Mail " + i.ToString() });
          }
        }
        private int _index;
        public int Index
        {
          get { return _index; }
          set
          {
            _index = value;
            Settings mySetting = new Settings();
            mySetting.StandardMailID = value.ToString();
            mySetting.Save();
          }
        }
        public List<Data> xMailKonfig { get; set; }
        void NotifyPropertyChanged(string propName)
        {
          if (PropertyChanged != null)
          {
            PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propName));
          }
        }
        public event PropertyChangedEventHandler PropertyChanged;
      }
      class Data
      {
        public string pName { get; set; }
      }
    }
    

    --
    Peter

    Samstag, 29. März 2014 07:20

Alle Antworten

  • Hallo,
    bei mir funktioniert dein gezeigter Code ohne Probleme.

    Was genau machst du denn im SelectedChanged-Event? Ist deine Deklaration der ComboBox noch irgendwie komplexer?

    Hier ist noch mein Codebehind, mit dem ich den Verhalt testete:

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            this.Items = new ObservableCollection<Item>();
            this.Items.Add(new Item("A"));
            this.Items.Add(new Item("B"));
            this.Items.Add(new Item("C"));
            this.Items.Add(new Item("D"));
            this.DataContext = this;
            InitializeComponent();
        }
    
        public ObservableCollection<Item> Items { get; set; }
    
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            cbProvider.SelectedIndex = 2;
        }
    
        private void cbProvider_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
    
        }
    }
    public class Item
    {
        public Item(string s)
        {
            pName = s;
        }
        public string pName { get; set; }
    }
    Und der XAML-Code:
    <StackPanel>
        <ComboBox Name="cbProvider" Grid.Row="0" Grid.Column="1"
                  ItemsSource="{Binding Items}"
                  IsSynchronizedWithCurrentItem="True" DisplayMemberPath="pName" 
                  SelectionChanged="cbProvider_SelectionChanged" 
            />
        <Button Content="Set to 2" Click="Button_Click"/>
    </StackPanel>



    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    Freitag, 28. März 2014 20:21
    Moderator
  • Guten Abend Tom

    Vielen lieben Dank für Deine Antwort.

    Im SelectionChanged speichere ich mir den veränderten Wert ab, damit beim nächsten Programmstart wieder der gleiche Wert verwendet werden kann. Die Combobox soll einfach immer das anzeigen, was der Benutzer zuletzt gewählt hat.

            private void cbProvider_SelectionChanged(object sender, SelectionChangedEventArgs e)
            {// Bei Auswahl von senden über, den Wert als Standardwert speichern.
    
                Settings mySetting = new Settings();
                mySetting.StandardMailID = cbProvider.SelectedIndex.ToString();
                mySetting.Save();
    
                //Application.Current.Resources["StandardMailID"] = cbProvider.SelectedIndex.ToString();
            }


    Im Konstruktor habe ich den Code um den oben gespeicherten Wert wieder zu setzen. 

                Settings mySetting = new Settings();
                string vWertStr = mySetting.StandardMailID;  // vWert wird mit 2 belegt wenn ich den zweiten Eintrag gewählt hatte.
                int vWertInt = Convert.ToInt32(vWertStr);
                cbProvider.SelectedIndex = vWertInt;	// Obwohl vWertInt den Wert 2 hat, bekommt SelectedIndex nach dieser Zeile -1

    Eigentlich ist der XML Teil meiner Combobox vollständig soweit ich das überblicken kann. Die Daten ind Window.Ressources sind <XmlDataProvider x:Key="xMailKonfig" Source="Konfiguration/eMailKonfiguration.xml" XPath="Konfiguration/Provider" />, das dürfte aber eigentlich nichts ausmachen (glaube ich).

    Wünsche angenehme Nacht
    Gruss Sabrina

    Freitag, 28. März 2014 21:18
  • Hi Sabrina,
    ich habe Deinen Code mal ausgeführt und es funktioniert problemlos. Vermutlich ist bei Dir im Konstruktor die Liste noch nicht verfügbar. Hier mal meine Demo:

    XAML:

    <Window x:Class="WpfApplication1.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:local="clr-namespace:WpfApplication1">
      <Window.Resources>
        <local:ViewModel x:Key="vm"/>
      </Window.Resources>
      <Grid DataContext="{Binding Source={StaticResource vm}}">
          <StackPanel Margin="10">
          <ComboBox Name="cbProvider" Grid.Row="0" Grid.Column="1"
                ItemsSource="{Binding xMailKonfig}"
                IsSynchronizedWithCurrentItem="True" DisplayMemberPath="pName" 
                    SelectedIndex="{Binding Index}"/>
    
        </StackPanel>
      </Grid>
    </Window>
    

    Dazu der ViewModel:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Windows;
    using WpfApplication1.Properties;
    
    namespace WpfApplication1
    {
      class ViewModel : INotifyPropertyChanged
      {
        public ViewModel()
        {
          Settings mySetting = new Settings();
          string vWertStr = mySetting.StandardMailID;  // vWert wird mit 2 belegt wenn ich den zweiten Eintrag gewählt hatte.
          _index = Convert.ToInt32(vWertStr);
          //
          xMailKonfig = new List<Data>();
          for (int i = 0; i < 10; i++)
          {
            xMailKonfig.Add(new Data() { pName = "Mail " + i.ToString() });
          }
        }
        private int _index;
        public int Index
        {
          get { return _index; }
          set
          {
            _index = value;
            Settings mySetting = new Settings();
            mySetting.StandardMailID = value.ToString();
            mySetting.Save();
          }
        }
        public List<Data> xMailKonfig { get; set; }
        void NotifyPropertyChanged(string propName)
        {
          if (PropertyChanged != null)
          {
            PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propName));
          }
        }
        public event PropertyChangedEventHandler PropertyChanged;
      }
      class Data
      {
        public string pName { get; set; }
      }
    }
    

    --
    Peter

    Samstag, 29. März 2014 07:20