2011-11-13 84 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

他们已经是字符串。 –

相关问题