2014-02-21 2 views
0

Я пытаюсь заставить мое приложение C#, wpf изменять значение в текстовом поле соответственно со значением в поле со списком с использованием операторов IF.изменить значение текстового поля в зависимости от выделенного элемента combobox

Идея состоит в том, что если в поле «Пол» выбрано «Мужской», то sex.Text должен показывать «m». Если у пола есть «Женский», то sex.Text должен показывать «f». Но, к сожалению, текстовое поле sex ничего не отображает при первом выборе. Но потом, он продолжает показывать противоположность тому, что я хочу. Например, когда я выбираю самку, он отображает «m» и наоборот, как если бы у него был случай замедленного действия.

Вот событие:

private void gender_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     if (gender.Text == "Male") 
     { 
      sex.Text = "m"; 
     } 
     if (gender.Text == "Female") 
     { 
      sex.Text = "f"; 
     } 
    } 

Любой ключ о том, как сделать эту работу?

Я предполагаю, что это может иметь какое-то отношение к событию winforms SelectedIndexChanged, которое заменяется SelectionChanged как эквивалент wpf.

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

Помогите оценить очень.

+2

Er ... 'System.Windows.Controls.ComboBox' не имеет события« TextChanged ». – Athari

+0

Попробуйте «Выбранное значение измененного значения ComboBox» и установите значения для Male и Female как 1 и 2, На основании значений u можете установить значение текстового поля – Harish

+0

Извините. Просто исправил это. Я набрал его, а не копировал и вставлял. Виноват. – Offer

ответ

1

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

Постарайтесь, чтобы получить текущее значение следующим образом:

private void gender_SelectionChanged(object sender, TextChangedEventArgs e) 
{ 
     var currentText = (sender as ComboBox).SelectedItem as string; 

     if (currentText.Equals("Male")) 
     { 
      sex.Text = "m"; 
     } 
     if (currentText.Equals("Female")) 
     { 
      sex.Text = "f"; 
     } 
} 

Я закодированы только здесь, так что извините за любой опечаток.

+0

Hie. У меня ошибка ».Text "после SelectedItem здесь: Ошибка \t 22 'object' не содержит определения для 'Text' и не может быть найден метод расширения 'Text', принимающий первый аргумент типа 'object' (вам не хватает директивы using или ссылка на сборку?) Я думаю, что это моя ошибка, потому что я ошибся в этом событии. Предполагается, что это SelectionChangedEventArgs вместо TextChangedEventArgs. – Offer

+0

Я отредактировал ответ мгновение назад. SelectedItem представляет элемент, который был помещен в ComboBox.Если это строка, просто сделайте отливку от объекта. –

+0

Спасибо, он работал в это время. Но у меня есть классический объект «Объект, не установленный в экземпляр объекта». Исключение было выбрано при попытке выбрать пол. Указывая на этот фрагмент кода: if (currentText.Equals («Мужчина»)) ... – Offer

0

Предполагая, что ваши детали в ComboBox являются только строки, вы могли бы использовать это:

private void gender_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    sex.Text = gender.SelectedValue.Equals("Male") ? "m" : "f"; 
} 

Похоже, что Selected -типа свойства на ComboBox отражают новый выбор, когда срабатывает событие, но Text недвижимость по-прежнему отражает предыдущий выбор.

+0

Это почти сработало ... Проблема в том, что при запуске он показывает только «f». Тем не менее, на первой стороне это показывает его на первом отборе. – Offer

+0

Я тестировал это, и это сработало для меня. Вы сказали, что хотите, чтобы текстовое поле отображало только «f» или «m». Есть ли что-то еще, что вы хотели отобразить в текстовом поле? Или вы имеете в виду, что текстовое поле никогда не изменяется на «m», даже если вы измените выделение в поле со списком? –

+0

Апологеты за задержку. Я имел в виду твою вторую догадку. Он никогда не изменяется на «m», независимо от того, выбираю ли я «Male» или «Female». Единственная часть, где отличается наш код, заключается в том, что в вашем примере «TextChangedEventArgs» является «SelectionChangedEventArgs» в моей. Это была моя ошибка за то, что он ошибся. Но если ваш код работает, то я предполагаю, что мой должен быть идентичен вашему ... – Offer

0

Если вы хотите написать WPF должным образом, то вам действительно необходимо изучить XAML. Вам не нужен какой-либо код, чтобы делать то, что вы хотите (за исключением свойств данных, конечно). Вы можете сделать это с помощью всего лишь пару DataTrigger с:

<StackPanel> 
    <ComboBox Name="ComboBox" ItemsSource="{Binding Items}" /> 
    <TextBox> 
     <TextBox.Style> 
      <Style> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding SelectedItem.Text, 
         ElementName=ComboBox}" Value="Male"> 
         <Setter Property="TextBox.Text" Value="m" /> 
        </DataTrigger> 
        <DataTrigger Binding="{Binding SelectedItem.Text, 
         ElementName=ComboBox}" Value="Female"> 
         <Setter Property="TextBox.Text" Value="f" /> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </TextBox.Style> 
    </TextBox> 
</StackPanel> 

Это, конечно, при условии, что у вас есть коллекция DependencyProperty для привязки данных в коде позади:

public static DependencyProperty ItemsProperty = DependencyProperty.Register("Items", typeof(ObservableCollection<Gender>), typeof(YourWindow)); 

public ObservableCollection<string> Items 
{ 
    get { return (ObservableCollection<string>)GetValue(ItemsProperty); } 
    set { SetValue(ItemsProperty, value); } 
} 
0

Я хотел бы изменить ваш код:

private void gender_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     if (gender.SelectedValue == "Male") 
     { 
      sex.Text = "m"; 
     } 
     if (gender.SelectedValue == "Female") 
     { 
      sex.Text = "f"; 
     } 
    } 
Смежные вопросы