将ComboBox SelectedItem绑定到DataContext值

本文关键字:DataContext 绑定 ComboBox SelectedItem | 更新日期: 2023-09-27 18:14:17

我需要根据父容器接收的数据上下文中的字段值绑定ComboBox的Selected Item。

容器是一个网格,当点击

时,它从itemcontrol中的一个项目接收数据上下文。
private void Button_Click(object sender , RoutedEventArgs e)
{
    GridEmployee.DataContext = ((Button)sender).DataContext;
}

* Button从Employee's Bounded to itemControl列表中获取itemsource

网格中包含一些控件,其中有一个通过Enum初始化的组合框

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

Employee类有一个匹配的属性Gender

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

GenderComboBox。SelectedItem被限定为有界对象Employee

的性别属性的值。
<ComboBox x:Name="GenderComboBox" SelectedItem="{Binding Gender , Mode=TwoWay}" /> 

这里的问题当然是项目没有被选中…

我认为可能是因为组合框中的项目是字符串,我尝试根据自定义转换器将它们绑定,该转换器仅取Enum值并返回。tostring ()

,但我不能检查这个,因为它抛出了一个anxamlparseexception在表单的承包商。

,我不完全明白为什么会发生,可能是因为它没有一个值转换当我形成加载。

所以总结一下我如何从我的雇员类绑定属性到一个带有属性值字符串表示形式的组合框?

将ComboBox SelectedItem绑定到DataContext值

在我的例子中工作得很好....

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
  }

只需将ComboBox的初始化更改为

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

应该可以,因为Employees类的Gender属性返回一个字符串。