将ComboBox SelectedItem绑定到DataContext值

时间:2011-11-13 14:23:54

标签: c# wpf data-binding combobox

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

容器是一个网格,当它被点击时从itemcontrol中的项接收它的datacontext

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

* Button从Employee's绑定到itemControl的列表获取了它的itemsource

网格中有一些控件,它们是一个组合框,我通过Enum

初始化
public Enum Gender
{
    Male,Female
};

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

Employee类具有匹配的Property Gender

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

GenderComboBox.SelectedItem的界限为有界对象Employee的Gender属性的值

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

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

我认为可能是因为组合框中的项目是字符串,我尝试根据自定义转换器绑定它们,该转换器只接受Enum Value并返回.ToString() 它的。

但是我无法检查在表单的承包商中抛出An XamlParseException的原因。

我没有完全理解它为什么会发生,可能是因为当我形成负载时它没有转换值。

总结如何从My Employee Class绑定一个Property 使用Property的Value的字符串表示形式的组合框?

2 个答案:

答案 0 :(得分: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
  }

请告诉我这是否指引您正确的方向......

答案 1 :(得分:0)

只需将ComboBox的初始化更改为

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

这应该有效,因为Employees类的Gender属性返回一个字符串。