Привязка ComboBox SelectedItem к значению DataContext - PullRequest
2 голосов
/ 13 ноября 2011

Мне нужно привязать выбранный элемент ComboBox в соответствии со значением поля в контексте данных, которое получает его родительский контейнер.

контейнер представляет собой сетку, которая получает свой текстовый текст от элемента в элементе управления, когда он щелкает

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

* Баттон получил свой источник предметов из списка ограниченных сотрудников до itemControl

сетка содержит некоторые элементы управления, среди которых комбо-бокс, который я инициализирую с помощью Enum

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 ограничен значением свойства Gender для ограниченного объекта. Employee

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

проблема здесь, конечно, в том, что элемент не выбирается ..

Я подумал, что это может быть потому, что элементы в выпадающем списке являются строками, и я пытаюсь связать их в соответствии с пользовательским конвертером, который просто принимает значение Enum и возвращает .ToString () об этом.

, но я не смог проверить это, потому что это вызвало исключение XamlParseException в подрядчике формы.

, который я не до конца понял, почему это произошло, может быть потому, что у него не было значения для преобразования при формировании нагрузки.

чтобы сделать вывод, как связать свойство из класса моего сотрудника в комбинированный список со строковым представлением значения свойства?

Ответы [ 2 ]

2 голосов
/ 14 ноября 2011

Хорошо работает в моем случае ....

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 голосов
/ 13 ноября 2011

Просто измените инициализацию вашего ComboBox на

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

Это должно сработать, потому что ваше свойство Gender класса Employees возвращает строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...