2011-11-13 13 views
2

親コンテナが受け取るデータコンテキスト内のフィールドの値に従って、ComboBoxのSelected Itemをバインドする必要があります。ComboBox SelectedItemからDataContext値へのバインド

コンテナはボタンが、それはitemControl

への従業員の有界のリストからitemsourceグリッドのGot *それは

private void Button_Click(object sender , RoutedEventArgs e) 
{ 
    GridEmployee.DataContext = ((Button)sender).DataContext; 
} 

をクリックだとき、それはitemcontrolの項目からDataContextのだ受け取りグリッドですそれらの中で、私は列挙型

public Enum Gender 
{ 
    Male,Female 
}; 

foreach(string _gender in Enum.GetNames(Gender)) 
{ 
    GenderComboBox.Items.Add(_gender); 
} 

Employeeクラスは、整合性の性別を持ってinitalizeコンボボックスをいくつかのコントロールを保持している

private string gender; 
public string Gender 
{ 
    get{return gender;} 
    set 
    { 
     gender = value ; 
     if(PropertyChanged != null) 
      PropertyChanged(this,new PropertyChangedEventArgs("Gender")); 
    } 
} 

GenderComboBox.SelectedItemが有界対象従業員

<ComboBox x:Name="GenderComboBox" SelectedItem="{Binding Gender , Mode=TwoWay}" /> 

ここで項目が選択されませんもちろんの問題のためのジェンダープロパティの値に制限されます。..

私はコンボボックスの項目が文字列であるために問題が発生する可能性があります。私はEnum値を受け取り、.ToString() を返すカスタムコンバーターに基づいてバインドしようとしています。

フォームの請負業者でXamlParseExceptionがスローされたため、これを確認できませんでした。

なぜ私はそれが起こったのか完全に理解していませんでした。なぜなら、負荷を形成するときに変換する値がないからかもしれません。

私の従業員クラス のプロパティをプロパティの値の文字列表現でコンボボックスにバインドするにはどうすればよいですか?従業員クラスのあなたの性別プロパティは、文字列を返すため

+0

私はちょうど模範を見た誰かが使用した場所 GenderComboBox.ItemSource = Enum.GetValues(typeof(Gender)); なぜアイテムソースを使用するのですか? –

+0

「ここでの問題は当然項目が選択されない」コードでプロパティを設定したときに、UIで項目の1つが選択されていると表示されるか、UIで項目の1つを選択したときにコードにプロパティが設定されると思われますか?私たちはどちらの方向に行くのですか... –

+0

また、コンボボックスの代わりにラジオボタンを使用することをおすすめします。あなたは、このメソッドを使用して列挙型で直接行うことができます:http://stackoverflow.com/questions/397556/wpf-how-to-bind-radiobuttons-to-an-enum –

答えて

2

はXAMLはこれが正しい方向にあなたをガイドしている場合、私に教えてください

public enum Gender 
{ 
    Male, 
    Female 
} 

/// <summary> 
/// Interaction logic for Window1.xaml 
/// </summary> 
public partial class Window1 : Window, INotifyPropertyChanged 
{ 
    private string myGender = Gender.Male.ToString(); 
    public string MyGender 
    { 
     get 
     { 
      return myGender; 
     } 

     set 
     { 
      myGender = value; 

      if (this.PropertyChanged != null) 
      { 
       this.PropertyChanged(this, new PropertyChangedEventArgs("MyGender")); 
      } 
     } 
    } 

    public string[] Genders 
    { 
     get 
     { 
      return Enum.GetNames(typeof(Gender)); 
     } 
    } 

    public Window1() 
    { 
     InitializeComponent(); 
    } 

    #region INotifyPropertyChanged Members 

    public event PropertyChangedEventHandler PropertyChanged; 

    #endregion 
    } 

の背後にあるコード

<Window x:Class="WpfApplication1.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:tk="http://schemas.microsoft.com/wpf/2008/toolkit" 
    Title="GenderSelection" Height="100" Width="300" x:Name="MyWindow"> 
    <Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*"/> 
     <RowDefinition Height="Auto"/> 
    </Grid.RowDefinitions> 
    <TextBlock FontSize="40" 
       Text="{Binding MyGender, ElementName=MyWindow, Mode=TwoWay}"/> 
    <ComboBox Grid.Row="1" 
       ItemsSource="{Binding Genders, ElementName=MyWindow}" 
       SelectedItem="{Binding MyGender, ElementName=MyWindow, Mode=TwoWay}"> 
     <ComboBox.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding}"/> 
      </DataTemplate> 
     </ComboBox.ItemTemplate> 
    </ComboBox> 
    </Grid>  
</Window> 

....私の場合にはうまく動作します.. 。

+0

私はあなたの答えについてあなたに質問を受けました。 Genderの配列をコードの後ろに追加してからViewModelに追加するまでの行はどこですか?私にとっては、列挙型と配列の両方がDataContextの一部である必要があるようです... –

0

ちょうど、動作するはず

foreach(string _gender in Enum.GetNames(Gender)) 
{ 
    GenderComboBox.Items.Add(_gender.ToString()); 
} 

にあなたのコンボボックスの初期化を変更します。

+0

'string.ToString'はそうしてはいけません(http://chat.stackoverflow.com/rooms/4953/discussion-between-eran-otzer-and-merlyn-morgan-graham)これを修正して...? –

+0

はすでに文字列です。 –