У меня возникли проблемы с получением значения TextBox в моем DataTemplate. Мой ListView привязан к ObservableCollection<lstProduse>, а TextBlock внутри шаблона данных привязан к свойству Denumire объекта lstProduse. Текст TextBox набирается вручную.

Я хочу перебрать все элементы, чтобы получить тексты TextBox и TextBlock.

<ListView x:Name="lstReceta" Grid.Row="1" Grid.Column="0" ItemsSource="{Binding lstProduse}" SelectionChanged="lstReceta_SelectionChanged">
   <ListView.ItemContainerStyle>
      <Style TargetType="ListViewItem">
         <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
      </Style>
   </ListView.ItemContainerStyle>
   <ListView.ItemTemplate>
      <DataTemplate>
         <Grid>
            <Grid.ColumnDefinitions>
               <ColumnDefinition Width="3*"/>
               <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <TextBlock Grid.Column="0" HorizontalAlignment="Center" Text="{Binding Denumire}"/>
            <TextBox Grid.Column="1" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Padding="10,0"/>
         </Grid>
      </DataTemplate>
   </ListView.ItemTemplate>
</ListView>
0
Wep4ik 29 Июл 2020 в 16:19
Каковы ваши цели. Если вы пытаетесь создать какой-либо тест пользовательского интерфейса, вам нужно использовать структуру UIAutomation и пометить textBlock специальными атрибутами.
 – 
Anton
29 Июл 2020 в 16:33
Моя цель - создать рецепт со списком ингредиентов. Итак, у меня есть 2 представления списка, одно с ингредиентами, другое пустое и 2 кнопки, одна для добавления ингредиентов в список рецептов, а другая для удаления. Каждый ингредиент, добавленный в список рецептов, имеет свой собственный шаблон данных с названием ингредиента и текстовым полем для ввода количества. Вот почему мне нужны оба значения, чтобы я мог отправить их в базу Mysql.
 – 
Wep4ik
29 Июл 2020 в 17:02
Если вы понимаете привязку достаточно хорошо, чтобы привязать текстовый блок, почему вы также не привязываете текст текстового поля к другому свойству?
 – 
Andy
29 Июл 2020 в 17:37
В таком случае вам не нужно получать значения из TextBox внутри dataTemplate. Вам нужно привязать SelectedItems или SelectedItem к свойству в вашей виртуальной машине.. (например, ChoosenIngredient), и вы можете использовать его внутри команды или обработчика, который добавит этот ингредиент в рецепт
 – 
Anton
29 Июл 2020 в 20:09
В конце концов, я добавляю свойство в свою модель, и в представлении я привязываю текстовое поле к этому свойству с двусторонней привязкой, возможно, одного пути к источнику может быть достаточно. Однако это не то, чего я хочу добиться в итоге, добавив новое свойство.
 – 
Wep4ik
29 Июл 2020 в 23:12

1 ответ

Лучший ответ

У вас есть модель представления с ObservableCollection. Вы уже связали свойство Text элемента TextBlock со свойством Denumire для вашего типа элемента. Просто создайте другое свойство, например Input для свойства Text элемента TextBox в вашем типе элемента и также привязать к нему.

<TextBox Grid.Column="1" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Padding="10,0" Text="{Binding Input}"/>

Затем вы можете просто перебрать вашу коллекцию lstProduse в своей модели представления, поскольку свойства ваших элементов синхронизируются через привязки в TextBlock и TextBox.

0
thatguy 29 Июл 2020 в 16:39
Ваш ответ помогает мне решить проблему, однако я не хотел добавлять новое свойство к моему типу элемента.
 – 
Wep4ik
29 Июл 2020 в 23:16
Я действительно рекомендую вам использовать подход MVVM со свойством, потому что это непросто сделать в представлении с шаблонами данных и элементом управления элементами. Вам придется написать собственный код представления, а это хрупко, требует больших усилий и не дает никаких преимуществ. Привязка к свойству — гораздо более простой и надежный способ. Если вы действительно не можете добавить свойство к этому типу элемента, вы также можете рассмотреть возможность создания для него типа прокси/оболочки.
 – 
thatguy
29 Июл 2020 в 23:29