Невозможно привязать выделение к WPF Combobox - PullRequest
1 голос
/ 31 июля 2011

Я хотел бы иметь ComboBox с двумя опциями «M» и «F» и установить выбор из моего кода со строкой одного из значений. Это кажется настолько простым, что даже стыдно спрашивать. Однако я не видел ни одного примера, который бы не содержал 50 строк кода с пользовательскими классами и т. Д. И т. Д. Чтобы упростить задачу, я хочу предварительно заполнить два параметра в своем XAML. Почему эта простая задача заставляет меня чувствовать себя ментальным карликом? Вот что у меня есть:

<ComboBox x:Name="cboGender"  >
    <ComboBoxItem Tag="M" Content="M"></ComboBoxItem>
    <ComboBoxItem Tag="F" Content="F"></ComboBoxItem>
</ComboBox>

Код сзади:

cboGender.SelectedValue = "M";

Пожалуйста, помогите, прежде чем я сломаю свой компьютер и вернусь к разработке ASP.NET навсегда.

Ответы [ 4 ]

2 голосов
/ 31 июля 2011

Попробуйте следующее:

cboGender.ItemsSource = new string [] { "M", "F" };
cboGender.SelectedItem = "M";

Вам необходимо установить для ItemsSource коллекцию предметов.ComboBox сгенерирует ComboBoxItems для вас.

1 голос
/ 31 июля 2011

Добавьте SelectedValuePath, и это сработает:

<ComboBox x:Name="cboGender" SelectedValuePath="Content" >
    <ComboBoxItem Tag="M" Content="M"></ComboBoxItem>
    <ComboBoxItem Tag="F" Content="F"></ComboBoxItem>
</ComboBox>

(SelectedValuePath="Tag" тоже будет работать, если иметь одинаковые данные в двух местах, то они тоже кажутся избыточнымихотя )


В качестве дополнительной заметки, аналогично ответу Колина, вы можете установить следующие пункты:

xmlns:sys="clr-namespace:System;assembly=mscorlib"
<ComboBox x:Name="cboGender">
    <sys:String>M</sys:String>
    <sys:String>F</sys:String>
</ComboBox>

( ОбаSelectedItem и SelectedValue работают в этом случае )

0 голосов
/ 31 июля 2011

В первом приближении, если вы когда-либо манипулируете элементами пользовательского интерфейса WPF в коде, вы делаете это неправильно. Конечно, вы можете создать поле со списком «M» и «F» и задать его выбор:

<ComboBox>
  <ComboBoxItem>M</ComboBoxItem>
  <ComboBoxItem>F</ComboBoxItem>
  <ComboBox.SelectedIndex>0</ComboBox.SelectedIndex>
</ComboBox>

Но что тогда? Что вы делаете с этим выбором? Если ваш ответ включает в себя что-то вроде этого:

if cboGender.SelectedValue == "M"

вы идете по дороге, которая приведет вас к написанию программ, которые очень сложно поддерживать.

Если, с другой стороны, вы создаете класс для привязки вашего пользовательского интерфейса, например:

public class MyViewModel
{
   public MyViewModelClass()
   {
      Gender = "M";
   }

   public IEnumerable<string> Genders { get { return new string[] { "M", "F" } };

   public string Gender { get; set; }
}

Тогда ваш XAML - при условии, что где-то вдоль линии, для которой вы установили DataContext для экземпляра MyViewModel - станет:

<ComboBox ItemsSource="{Binding Genders}" SelectedValue="{Binding Gender}"/>

Любая другая логика, которая использует свойство Gender, теперь смотрит на этот класс, а не на пользовательский интерфейс. Таким образом, вы можете изменить пользовательский интерфейс, не влияя на вашу логику, и наоборот.

(Обратите внимание, что, хотя модели представления обычно реализуют INotifyPropertyChanged, вам нужно только , чтобы сделать это, , если вы собираетесь изменять Gender в своем коде и хотите, чтобы новые значения отображались в интерфейсе.)

0 голосов
/ 31 июля 2011

Попробуйте это - cboGender.SelectedIndex = 0; перед тем, как разбить вашу систему ..:)

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