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

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

21.07.2016, 10:32. Просмотров 528. Ответов 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 (C# WPF):

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

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

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

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

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

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

5
hamin
247 / 235 / 165
Регистрация: 21.11.2012
Сообщений: 788
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
247 / 235 / 165
Регистрация: 21.11.2012
Сообщений: 788
21.07.2016, 13:53 #4
Oleg_D,

разбирайся
0
Вложения
Тип файла: zip PRIMER.zip (64.3 Кб, 3 просмотров)
hamin
247 / 235 / 165
Регистрация: 21.11.2012
Сообщений: 788
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
Привет! Вот еще темы с решениями:

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

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

Изменение программно созданных TextBox по событию программно созданного CheckBox
Помогите пожалуйста! мне нужно разрешить изменение полей всех TextBox и...

Как получить доступ к динамически созданному элементу по имени?
Здравствуйте!!! Подскажите как получить доступ к элементу который был создан...


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

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

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