2009-10-20 9 views
2

Pourquoi dans l'exemple suivant la zone de liste déroulante est-elle définie sur vide à la place de "M."?Comment puis-je définir la valeur sélectionnée d'un Combobox XAML?

XAML:

<Window x:Class="TestComb82822.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300"> 
    <StackPanel HorizontalAlignment="Left"> 
     <ComboBox SelectedValue="{Binding Salutation}" Width="200"> 
      <ComboBoxItem>Company</ComboBoxItem> 
      <ComboBoxItem>Ms.</ComboBoxItem> 
      <ComboBoxItem>Mr.</ComboBoxItem> 
     </ComboBox> 
    </StackPanel> 
</Window> 

code derrière:

using System.Windows; 
using System.ComponentModel; 

namespace TestComb82822 
{ 
    public partial class Window1 : Window, INotifyPropertyChanged 
    { 
     #region ViewModelProperty: Salutation 
     private string _salutation; 
     public string Salutation 
     { 
      get 
      { 
       return _salutation; 
      } 

      set 
      { 
       _salutation = value; 
       OnPropertyChanged("Salutation"); 
      } 
     } 
     #endregion 

     public Window1() 
     { 
      InitializeComponent(); 
      DataContext = this; 
      Salutation = "Mr."; 
     } 

     #region INotifiedProperty Block 
     public event PropertyChangedEventHandler PropertyChanged; 

     protected void OnPropertyChanged(string propertyName) 
     { 
      PropertyChangedEventHandler handler = PropertyChanged; 

      if (handler != null) 
      { 
       handler(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     } 
     #endregion 

    } 
} 

Deuxième essai:

Bryan, SelectedItem et WindowLoaded ne fonctionne pas non plus, cela fait toujours le ComboBox vide:

XAML:

<Window x:Class="TestCombo234.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300"> 
    <StackPanel HorizontalAlignment="Left"> 
     <ComboBox SelectedItem="{Binding Salutation}" Width="200"> 
      <ComboBoxItem>Company</ComboBoxItem> 
      <ComboBoxItem>Ms.</ComboBoxItem> 
      <ComboBoxItem>Mr.</ComboBoxItem> 
     </ComboBox> 
    </StackPanel> 
</Window> 

code Derrière:

using System.Windows; 
using System.ComponentModel; 

namespace TestCombo234 
{ 
    public partial class Window1 : Window, INotifyPropertyChanged 
    { 
     #region ViewModelProperty: Salutation 
     private string _salutation; 
     public string Salutation 
     { 
      get 
      { 
       return _salutation; 
      } 

      set 
      { 
       _salutation = value; 
       OnPropertyChanged("Salutation"); 
      } 
     } 
     #endregion 

     public Window1() 
     { 
      InitializeComponent(); 
      DataContext = this; 
      Loaded += new RoutedEventHandler(Window1_Loaded); 
     } 

     void Window1_Loaded(object sender, RoutedEventArgs e) 
     { 
      Salutation = "Mr."; 
     } 

     #region INotifiedProperty Block 
     public event PropertyChangedEventHandler PropertyChanged; 

     protected void OnPropertyChanged(string propertyName) 
     { 
      PropertyChangedEventHandler handler = PropertyChanged; 

      if (handler != null) 
      { 
       handler(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     } 
     #endregion 
    } 
} 

Répondre

0

Par défaut, un ComboBox doit en effet choisir son premier élément. Toutefois, vous créez ici une liaison de SelectedValue, qui est par défaut bidirectionnelle. De plus, en charge, la valeur de Salutation (à laquelle vous vous liez) est en réalité toujours nulle. Essayez de définir Salutation = "Mr.";avantInitializeComponent et tout devrait bien se passer.

+0

même lorsque Salutation = "M." est avant InitializeComponent la combobox est toujours vide :-( –

+1

@Edward: Peut-être essayer de lier 'SelectedItem' au lieu de' SelectedValue' en XAML? – Noldorin

+0

merci mais SelectedItem laisse toujours le ComboBox vide –

1

Vous devez d'abord définir SelectedItem au lieu de SelectedValue. Deuxièmement, vous définissez le SelectedItem avant que le ComboBox ait été configuré, essayez de définir le SelectedItem dans l'événement chargé de la fenêtre.

+0

J'ai essayé cela, mais la liste déroulante est toujours vide (code posté ci-dessus) –

+3

Oh, vos articles ne sont pas des chaînes.Vous devez utiliser la propriété ItemsSource pour utiliser SelectedItem et/ou SelectedValue. Vous pouvez également le faire en utilisant M. plutôt que simplement Mr.

1

Ma solution dans ce cas était simplement d'utiliser ItemIndex, c'est-à-dire "Mr." = 2

0

Vous créez une collection List/Observable dans le code derrière.

public ObservableCollection<string> Collection 
     { 
      get; set; 
     } 

par exemple:

<ComboBox Name="NameCombo" ItemsSource="{Binding}"> 

puis régler la collection observable comme datacontext pour ComboBox dans le procédé Window_Loaded.

par exemple:

NameCombo.DataContext=Collection; 
Questions connexes