Получите текст поля комбинированного списка в C#

В «реальной жизни» я создавал бы пользовательский элемент управления на основе текстового поля и определял все состояния в Blend и, возможно, добавил грязное состояние или что-то в этом роде и управлял всем этим через логическое свойство. Тем не менее, вот некоторые доказательства концептуального кода, который, кажется, делает то, что я собираю вам нужно. Я думаю, что единственное реальное отличие от того, что вы пытались сделать, это то, что я отслеживаю «старое значение» и сравниваю его, когда текст изменяется, чтобы определить его чистоту. Магический сброс также контролирует это старое значение.

управляющий код:

namespace DirtyTextBox
{
    public class DirtyNotifyingTextBox : TextBox
    {
        public DirtyNotifyingTextBox()
        {
            this.DefaultStyleKey = typeof(TextBox);
            DataContextChanged += DirtyNotifyingTextBox_DataContextChanged;
        }

        private void DirtyNotifyingTextBox_DataContextChanged(Windows.UI.Xaml.FrameworkElement sender, Windows.UI.Xaml.DataContextChangedEventArgs args)
        {
            _originalValue = this.Text;
            TextChanged += DirtyNotifyingTextBox_TextChanged;
            SetToGreen();
        }

        private string _originalValue { get; set; }

        private void DirtyNotifyingTextBox_TextChanged(object sender, TextChangedEventArgs e)
        {
            if (this.Text != _originalValue)
            {
                SetToRed();
            }
            else
            {
                SetToGreen();
            }
        }

        private void SetToGreen()
        {
            this.BorderBrush = new SolidColorBrush(Windows.UI.Color.FromArgb(255, 50, 205, 0));
        }

        private void SetToRed()
        {
            this.BorderBrush = new SolidColorBrush(Windows.UI.Color.FromArgb(255, 255, 0, 0));
        }

        public void Reset()
        {
            Reset(string.Empty);
        }

        public void Reset(string resetValue)
        {
            _originalValue = resetValue;
            this.Text = resetValue;
        }

        protected override void OnApplyTemplate()
        {
            base.OnApplyTemplate();
        }
    }
}

пример использования:

<StackPanel Orientation="Horizontal">
    <local:DirtyNotifyingTextBox x:Name="dtextbox" Width="250" Height="50" />
    <Button Content="reset" Click="Reset" Margin="10 0" />
    <Button Content="reset with value" Click="ResetWithValue" Margin="10 0" />
    <Button Content="change text with code" Click="UpdateText" Margin="10 0" />
</StackPanel>

код позади:

private void Reset(object sender, RoutedEventArgs e)
{
    dtextbox.Reset();
}

private void ResetWithValue(object sender, RoutedEventArgs e)
{
    dtextbox.Reset("Magic Reset");
}

private void UpdateText(object sender, RoutedEventArgs e)
{
    dtextbox.Text = "updated text";
}
6
задан abatishchev 5 August 2010 в 11:22
поделиться

6 ответов

Я просто создал простую форму окон, и все работало хорошо на меня. Вот код.

public enum Test
{
    One, Two, Three
}

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        this.comboBox1.DataSource = Enum.GetNames(typeof(Test));
    }

    public Test Test
    {
        get 
        {
            return (Test)Enum.Parse(typeof(Test), this.comboBox1.Text);
        }
        set
        {
            this.comboBox1.Text = value.ToString();
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        MessageBox.Show(this.Test.ToString());

        this.Test = Test.Two;

        MessageBox.Show(this.Test.ToString());
    }
}
0
ответ дан 8 December 2019 в 02:22
поделиться

Установите DropDownStyle из ComboBox к DropDownList. Это гарантирует, что только элементы уже в списке могут быть выбраны (никакая потребность проверить, что текст на самом деле является допустимым значением). Затем, если Вы используете Enum.GetValues(typeof(BookType)) заполнить поле комбинированного списка затем typeComboBox.SelectedItem свойство будет значением BookType. Таким образом, можно использовать это в методе считывания свойства и методе set.

Таким образом подводить итог. Вы не должны связывать поле комбинированного списка со списком текстовых значений, пока Вы используете стиль DropDownList. Используйте свойство SelectedItem для получения объекта требуемого типа вместо того, чтобы проверить текстовое свойство.

Править: Вам, вероятно, придется проверить свойство SelectedItem на пустой указатель

2
ответ дан 8 December 2019 в 02:22
поделиться

Необходимо попробовать this.typeComboBox. SelectedItem. ToString ()

1
ответ дан 8 December 2019 в 02:22
поделиться

Вы попытались использовать this.typeComboBox.SelectedText вместо typeComboBox.Text ?

1
ответ дан 8 December 2019 в 02:22
поделиться

Поле комбинированного списка запускается в индексе-1, который не имеет никакого текста, таким образом пустая строка: ""

Я затем изменяю индекс на BookType, в котором я нуждаюсь, и затем я получаю неправильный вывод...

1
ответ дан 8 December 2019 в 02:22
поделиться

Попробуйте это. это сработало для меня.

string selectedText = this.ComboBox.GetItemText(this.ComboBox.SelectedItem);

Метод GetItemText анализирует элемент и возвращает текст, привязанный к этому элементу.

34
ответ дан 8 December 2019 в 02:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: