Получить свойство .Text из динамически добавленного текстового поля

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

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

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

Что я пытаюсь сделать


person webdad3    schedule 15.05.2013    source источник
comment
I am dynamically adding several textboxes to my grid in my code behind - Неправильный подход. Изучите МВВМ. Используйте ItemsControl. WPF - это не Winforms. Опубликуйте скриншот того, что вам нужно, и я могу рассказать вам, как правильно это сделать в WPF.   -  person Federico Berasategui    schedule 15.05.2013
comment
Хорошо, у вас есть хороший учебник по ItemsControl?   -  person webdad3    schedule 15.05.2013
comment
Возможно, это поможет вам. Тем не менее, это немного отличается от того, что вы описываете здесь. Выложите скриншот того, что вам нужно.   -  person Federico Berasategui    schedule 15.05.2013
comment
сделано - я добавил ОЧЕНЬ элементарный скриншот   -  person webdad3    schedule 15.05.2013
comment
Я делаю что-то подобное в проекте С#... по моей идее, возможно, вы можете искать эти текстовые поля по их именам и типам в ваших дочерних элементах сетки. Я видел ваш код до того, как вы отредактируете свой собственный пост, возможно, вы могли бы определить ваша стековая панель глобально, а затем ищите в ней текстовые поля   -  person Fuad    schedule 15.05.2013
comment
@Fuad Смотрите мой ответ. Это ПРАВИЛЬНЫЙ подход в WPF.   -  person Federico Berasategui    schedule 15.05.2013
comment
Ага... Я понял... Использование {Bindings} является обычным и правильным способом в WPF... хороший ответ, друг. Спасибо, что предупредил меня :)   -  person Fuad    schedule 15.05.2013


Ответы (3)


Прежде всего, вы должны отказаться от традиционного менталитета манипулирования элементами пользовательского интерфейса в коде и внедрить MVVM

<Window x:Class="MiscSamples.QueryBuilderSample"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:MiscSamples"
        Title="QueryBuilderSample" Height="300" Width="300">
    <ItemsControl ItemsSource="{Binding}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition/>
                        <ColumnDefinition/>
                        <ColumnDefinition Width="Auto"/>
                    </Grid.ColumnDefinitions>

                    <ComboBox ItemsSource="{Binding Operators}" 
                              SelectedItem="{Binding Operator}"/>

                    <TextBox Text="{Binding Value}" Grid.Column="1"/>

                    <Button Content="Add" Grid.Column="2"/>
                </Grid>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</Window>

Код позади:

 public partial class QueryBuilderSample : Window
    {
        public List<QueryCriteria> Criterias { get; set; } 

        public QueryBuilderSample()
        {
            InitializeComponent();

            DataContext = Criterias = Enumerable.Range(0, 10).Select(x => new QueryCriteria()).ToList();
        }
    }

ViewModel:

public class QueryCriteria
{
    public List<Operators> Operators
    {
        get
        {
            return Enum.GetValues(typeof(Operators))
                       .Cast<Operators>()
                       .ToList();
        }
    }

    public Operators Operator { get; set; }
    public string Value { get; set; }
}

public enum Operators
{
    Equals,
    Contains,
    GreaterThan,
    SmallerThan,
}

Результат:

введите здесь описание изображения

  • Обратите внимание, что я не делаю ни одной строки кода для создания элементов пользовательского интерфейса или управления ими. Все делается с помощью привязки данных.
  • Простой код. Никакой сложной обработки событий или чего-то в этом роде.
  • Декларативный кодекс. Все просто, простые свойства и INotifyPropertyChanged. Это подход по умолчанию ко ВСЕМ в WPF.
person Federico Berasategui    schedule 15.05.2013
comment
большое спасибо за этот код. Прошло слишком много времени с тех пор, как я делал какие-либо MVVM, поэтому я ценю перенаправление - person webdad3; 16.05.2013

Когда вы вставляете текстовое поле, сохраняйте ссылку на него в каком-либо объекте. Словарь может быть хорошим выбором. Таким образом, вы сможете получить эту ссылку позже, и из этой ссылки вы сможете прочитать ее свойство Text.

person Geeky Guy    schedule 15.05.2013
comment
-1 Это поощряет использование плохих практик и устаревших шаблонов. - person Federico Berasategui; 15.05.2013

@jeff V, вы можете просто захватить текст текстового поля, используя имя, которое вы назначаете этим текстовым полям ... вы используете tb1, tb2 в качестве имени текстовых полей ... поэтому вы можете легко получить значения, используя

person Haji    schedule 15.05.2013
comment
-1 Неправда. при этом не создается поля, к которому можно получить доступ. Также это неправильный способ сделать это. - person Federico Berasategui; 15.05.2013