Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
Oleg_D
0 / 0 / 1
Регистрация: 01.02.2016
Сообщений: 6
1

Доступ до динамически созданного TextBox

21.07.2016, 10:32. Просмотров 553. Ответов 5
Метки нет (Все метки)

Всем привет. У меня есть примерно такая разметка:

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
    <Page
        x:Class="Project1.TestPage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:i="using:Microsoft.Xaml.Interactivity"
        xmlns:core="using:Microsoft.Xaml.Interactions.Core"
        xmlns:media="using:Microsoft.Xaml.Interactions.Media"
        mc:Ignorable="d"
        Background="#f4f4f4"
        RequestedTheme="Light">
        <Page.Resources>
            <!-- Шаблон элемента списка -->
            <DataTemplate x:Key="List_Item">
                <Border Background="#fff">
                    <!-- TextBox'ы, значение которых необходимо получить -->
                    <TextBox PlaceholderText="{Binding value}"/>
                </Border>
            </DataTemplate>
        </Page.Resources>
    
        <Grid>
            <!-- Список, который будем тиражировать -->
            <ListBox x:Name="MyList"
                     ItemTemplate="{StaticResource List_Item}"
                     Background="Transparent"/>
        </Grid>
    </Page>
После некоторых расчетов в `behind-code` мы получаем:

C#
1
2
3
4
5
    MyList.ItemsSource = new object[] {
        new {value = "One"},
        new {value = "Two"},
        new {value = "Three"}
    };
Число элементов заранее не известно.
Моя проблема заключается в том, чтоб получить пользовательский ввод из `TextBox`. Пробовал:

C#
1
    foreach (var item in MyList.Items) {}
но в item лежит объект привязки, а не ListBoxItem.
Присвоение имени x:Name текстбоксам эффекта тоже не дает.



P.S. Второй мини вопрос. В процессе работы мне показалось что `ListBox` не слишком хорош для такой задачи, нужно много действий и стилей по-умолчанию отключать. Есть ли контрол, которому просто можно передать разметку и `ItemSource`, и он просто растиражирует ее(разметку), реализовав тем самым список элементов, без функционала вроде выделения и прочего?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.07.2016, 10:32
Ответы с готовыми решениями:

Закруглить углы динамически созданного TextBox
Создаю по нажатию кнопки, динамически , TextBox и хочу закруглить углы но не...

Поиск динамически созданного елемента
Всем доброе время суток. Ни как не могу решить проблемку.... подскажите...

Изменения стиля ячеек динамически созданного DataGrid
Динамически создается несколько DataGrid-ов, в зависимости от количества листов...

Доступ к экземпляру класса Window созданного в XAML коде
Экземпляр класса в XAML коде создается автоматически и к свойству имени можно...

Обращение к динамически созданным TextBox
Помогите пожалуйста! Динамически создаю textBoxы в которых выводиться...

5
hamin
258 / 244 / 169
Регистрация: 21.11.2012
Сообщений: 804
21.07.2016, 10:49 2
Oleg_D,

ваша проблема заключается в строке:

C#
1
2
3
4
5
MyList.ItemsSource = new object[] {
        new {value = "One"},
        new {value = "Two"},
        new {value = "Three"}
    };
вы в коллекцию itemsSource всегда пихаете новый массив.
создайте коллекцию типа
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ObservableCollection<string> _myCol;
 
public ObservableCollection<string> MyCol 
{
get { if (_myCol == null) _myCol = new ObservableCollection(); return _myCol; }
set { _myCol = value; OnPropertyChanged(); }
}
 
//И свойство текущего выбора
private string _aktStr;
 
public string AktStr {
get {return _aktStr; }
set { _aktStr = value; OnPropertyChanged(); }
}
и далее нужно не в кода задавать ItemsSouce, а сделать привязку к коллекции и указать свойство текущего выбора:

XML
1
2
3
4
<ListBox x:Name="MyList" 
                     ItemsSource="{Binding myCol}" SelectedItem="{Binding AktStr}"
                     ItemTemplate="{StaticResource List_Item}"
                     Background="Transparent"/>
ну и соответственно подправить шаблон:

XML
1
2
3
4
5
6
 <DataTemplate x:Key="List_Item">
                <Border Background="#fff">
                    <!-- TextBox'ы, значение которых необходимо получить -->
                    <TextBox PlaceholderText="{Binding}"/>
                </Border>
            </DataTemplate>
тогда к введенному тексту можно будет обращаться с помощью свойства AktStr.
0
Oleg_D
0 / 0 / 1
Регистрация: 01.02.2016
Сообщений: 6
21.07.2016, 12:40  [ТС] 3
Благодарю за отклик, но я новичек, поэтому не все в Вашем ответе понял.
1. вы в коллекцию itemsSource всегда пихаете новый массив. - Что значит каждый раз? Этот код располагается в событии OnNavigatedTo, разве он не единожды вызывается?

2. <ListBox x:Name="MyList" SelectedItem="{Binding AktStr}" - Из этого кода создается впечатление, что прочитается только один TextBox, а нужно все(Это одна из тех вещей, из-за которых мне кажется что я не правильно тут применил ListBox).

3. Я сильно сократил код для его лучшего восприятия на форуме. value - лишь одно из нескольких полей в коллекции. А по такой логике привяжется только одно значение из коллекции. Может все-таки можно выпутаться через ItemSource и behind-code? Понимаю что не по паттерну, но мне пока так проще воспринимать свой код.

4. Никак не могу заставить работать Ваш пример, требует аргументы в new ObservableCollection();:
Использование универсального тип "ObservableCollection<T>" требует аргументы типа 1.
Имя "OnPropertyChanged" не существует в текущем контексте.

Я кажись забыл упомянуть что приложение под Windows Phone 8.1, поправлю первое сообщение.
0
hamin
258 / 244 / 169
Регистрация: 21.11.2012
Сообщений: 804
21.07.2016, 13:53 4
Oleg_D,

разбирайся
0
Вложения
Тип файла: zip PRIMER.zip (64.3 Кб, 3 просмотров)
hamin
258 / 244 / 169
Регистрация: 21.11.2012
Сообщений: 804
21.07.2016, 13:59 5
Oleg_D,

Что значит каждый раз? Этот код располагается в событии OnNavigatedTo, разве он не единожды вызывается?
вы же не написали где вы вызываете присвоение коллекции

Из этого кода создается впечатление, что прочитается только один TextBox, а нужно все(Это одна из тех вещей, из-за которых мне кажется что я не правильно тут применил ListBox).
в данном случае данное свойство будет содержать текст выделенного в листбоксе элемента. НО если вы используете ObservableCollection, то она автоматически остается синхронной со всеми полями, т.е. все изменения будут непосредственно в ней.
3. Я сильно сократил код для его лучшего восприятия на форуме. value - лишь одно из нескольких полей в коллекции. А по такой логике привяжется только одно значение из коллекции. Может все-таки можно выпутаться через ItemSource и behind-code? Понимаю что не по паттерну, но мне пока так проще воспринимать свой код.
по вашему коду сделал коллекцию, в вашем случае можете сделать не коллекцию стрингов, а, к примеру, ObservableCollection<MyClass> и привязывайтесь к нужному свойству. вам ничего не мешает
1
Oleg_D
0 / 0 / 1
Регистрация: 01.02.2016
Сообщений: 6
25.07.2016, 12:21  [ТС] 6
Сделал чуть по-другому, но на мысль натолкнул именно Ваш ответ. Переписываем TextBox:
XML
1
<TextBox Text="{Binding value, Mode=TwoWay}" PlaceholderText="{Binding p_value}"/>
И теперь в любое время в value лежит значение, указанное пользователем.
0
25.07.2016, 12:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.07.2016, 12:21

Прозрачный фон в динамически создаваемом textbox-е
подскажите как сделать чтоб в динамически создаваемом текст боксе был...

Получить доступ к динамически созданному контролу
При загрузке окна динамически создаю некоторое количество StackPanel(количество...

Не могу записать в динамически созданный textBox информацию
Как получить или записать информацию динамически созданного textBox. Ничего не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru