2011-11-13 118 views
2

我需要根據父容器接收的數據上下文中的字段值來綁定組合框的選定項。將組合框SelectedItem綁定到DataContext值

容器是當它被點擊

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

接收它的DataContext從項目在itemcontrol網格*按鈕得到它的ItemSource從員工界的列表中itemControl

電網其中包含一些控件其中一個組合框,我通過枚舉初始化

public Enum Gender 
{ 
    Male,Female 
}; 

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

Employee類具有匹配的屬性性別

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

這裏當然,該項目沒有得到選擇的問題..

我可能是它的原因,在組合框中的項目是字符串,我試圖根據自定義轉換器綁定它們,它只取得枚舉值並返回它的.ToString() 。

但我無法檢查此問題,因爲在表單的承包商中拋出了An XamlParseException。

我沒有完全理解它爲什麼會發生,可能是因爲它沒有一個值來轉換,當我形成負載。

因此得出結論我如何將屬性從我的員工類 綁定到具有屬性值的字符串表示的組合框?

+0

我剛看到一個例子其中有人使用 GenderComboBox.ItemSource = Enum.GetValues(typeof(Gender)); 那麼爲什麼要使用item來源? –

+0

「這裏的問題當然是物品沒有被選中」。當您在代碼中設置屬性時,您是否希望其中一個項目顯示爲在UI上選定的項目,或者您是否希望在選擇UI中的某個項目時設置了代碼屬性?我們要去哪裏... –

+0

另外我建議在這裏使用單選按鈕而不是組合框。你可以直接使用這種方法與枚舉:http://stackoverflow.com/questions/397556/wpf-how-to-bind-radiobuttons-to-an-enum –

回答

2

很好地工作在我的情況....

XAML

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

代碼隱藏

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 
    } 

讓我知道這將引導您正確的方向..

+0

我向您提出了一個關於您的答案的問題。 將Genders數組添加到後面的代碼並將其添加到ViewModel之間的界限在哪裏?對我來說,它看起來像枚舉和數組應該是DataContext的一部分... –

0

您的組合框的初始化只是改變

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

這應該工作,因爲Employees類的您的性別屬性返回一個字符串。

+0

'string.ToString' should not解決這個問題...? –

+0

他們已經是字符串。 –

相關問題