2009-10-20 90 views
2

为什么在下面的例子中,组合框设置为空而不是“先生”?如何设置XAML Combobox的选定值?

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> 

后面的代码:

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 

    } 
} 

第二个尝试:

布莱恩的SelectedItem和WindowLoaded也不管用,这仍使组合框空白:

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> 

代码背后:

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 
    } 
} 

回答

0

默认情况下,ComboBox的确应该选择它的第一项。但是,您在此处创建了SelectedValue的绑定,这是默认双向。更重要的是,在负载情况下,Salutation(绑定到的)的值实际上仍然为空。尝试设置Salutation = "Mr.";之前InitializeComponent和所有应该没问题。

+0

即使称呼= “先生”是在InitializeComponent之前,组合框仍然是空的:-( – 2009-10-20 13:10:58

+1

@爱德华:也许尝试在XAML中尝试绑定'SelectedItem'而不是'SelectedValue'? – Noldorin 2009-10-20 13:35:13

+0

谢谢但SelectedItem仍然使组合框空白 – 2009-10-20 13:47:37

1

首先,您需要设置SelectedItem而不是SelectedValue。其次,在实际设置ComboBox之前设置SelectedItem,尝试在Window的加载事件中设置SelectedItem。

+0

我试过了,但组合框仍然是空的(上面的代码) – 2009-10-20 14:39:30

+3

哦!你的项目不是字符串,你需要使用ItemsSource属性以使用SelectedItem和/或SelectedValue。您也可以通过使用先生而不只是 Mr。 2009-10-20 16:39:18

1

我在这种情况下的解决方案是只使用ItemIndex,即“先生” = 2

0

你可以在后面的代码中创建List/Observable集合。

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

如:

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

然后设置观察集合作为的datacontext在Window_Loaded方法组合框。

如:

NameCombo.DataContext=Collection;