Возникла проблема, имеются множество TextBox-ов, в которых есть значения, все эти TextBox-ы находятся в ItemsControl. Необходимо получить значения всех этих TextBox-ов и передать в функцию из другого класса. Пробовал использовать методы ItemsSource и Items, но при дебаге вижу, что контейнеры null.
XAML код:
<Grid Background="White">
<Grid.RowDefinitions>
<RowDefinition Height="100"/>
<RowDefinition Height="*"/>
<RowDefinition Height="35"/>
</Grid.RowDefinitions>
<StackPanel Orientation="Vertical" VerticalAlignment="Center" HorizontalAlignment="Center" Grid.Row="1">
<ItemsControl x:Name="NFR">
<ItemsControl.ItemTemplate>
<DataTemplate>
<WrapPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center">
<StackPanel Orientation="Vertical">
<StackPanel>
<TextBlock Text="ID аккаунта" FontSize="12" FontFamily="Comic Sans MS" Foreground="#498C51"/>
<TextBox x:Name="id_account" IsReadOnly="True" Width="200" Height="30" Text="{Binding id_account}" Background="{x:Null}" BorderBrush="#498C51" BorderThickness="2" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" FontSize="15" FontFamily="Comic Sans MS" Foreground="DimGray">
<TextBox.Resources>
<Style TargetType="Border">
<Setter Property="CornerRadius" Value="10"/>
</Style>
</TextBox.Resources>
</TextBox>
</StackPanel>
<StackPanel Margin="0,10">
<TextBlock Text="ID клиента" FontSize="12" FontFamily="Comic Sans MS" Foreground="#498C51"/>
<TextBox x:Name="id_client" IsReadOnly="True" Width="200" Height="30" Text="{Binding id_client}" Background="{x:Null}" BorderBrush="#498C51" BorderThickness="2" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" FontSize="15" FontFamily="Comic Sans MS" Foreground="DimGray">
<TextBox.Resources>
<Style TargetType="Border">
<Setter Property="CornerRadius" Value="10"/>
</Style>
</TextBox.Resources>
</TextBox>
</StackPanel>
<StackPanel>
<TextBlock Text="Логин" FontSize="12" FontFamily="Comic Sans MS" Foreground="#498C51"/>
<TextBox x:Name="login" Width="200" Height="30" Text="{Binding login}" Background="{x:Null}" BorderBrush="#498C51" BorderThickness="2" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" FontSize="15" FontFamily="Comic Sans MS">
<TextBox.Resources>
<Style TargetType="Border">
<Setter Property="CornerRadius" Value="10"/>
</Style>
</TextBox.Resources>
</TextBox>
</StackPanel>
<StackPanel Margin="0,10">
<TextBlock Text="Пароль" FontSize="12" FontFamily="Comic Sans MS" Foreground="#498C51"/>
<TextBox x:Name="password" Width="200" Height="30" Text="{Binding password}" Background="{x:Null}" BorderBrush="#498C51" BorderThickness="2" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" FontSize="15" FontFamily="Comic Sans MS">
<TextBox.Resources>
<Style TargetType="Border">
<Setter Property="CornerRadius" Value="10"/>
</Style>
</TextBox.Resources>
</TextBox>
</StackPanel>
<StackPanel>
<TextBlock Text="Имя" FontSize="12" FontFamily="Comic Sans MS" Foreground="#498C51"/>
<TextBox x:Name="name" Width="200" Height="30" Text="{Binding name_}" Background="{x:Null}" BorderBrush="#498C51" BorderThickness="2" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" FontSize="15" FontFamily="Comic Sans MS">
<TextBox.Resources>
<Style TargetType="Border">
<Setter Property="CornerRadius" Value="10"/>
</Style>
</TextBox.Resources>
</TextBox>
</StackPanel>
<StackPanel Margin="0,10">
<TextBlock Text="Фамилия" FontSize="12" FontFamily="Comic Sans MS" Foreground="#498C51"/>
<TextBox x:Name="second_name" Width="200" Height="30" Text="{Binding second_name}" Background="{x:Null}" BorderBrush="#498C51" BorderThickness="2" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" FontSize="15" FontFamily="Comic Sans MS" >
<TextBox.Resources>
<Style TargetType="Border">
<Setter Property="CornerRadius" Value="10"/>
</Style>
</TextBox.Resources>
</TextBox>
</StackPanel>
<StackPanel>
<TextBlock Text="Отчество" FontSize="12" FontFamily="Comic Sans MS" Foreground="#498C51"/>
<TextBox x:Name="patronymic" Width="200" Height="30" Text="{Binding patronymic}" Background="{x:Null}" BorderBrush="#498C51" BorderThickness="2" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" FontSize="15" FontFamily="Comic Sans MS">
<TextBox.Resources>
<Style TargetType="Border">
<Setter Property="CornerRadius" Value="10"/>
</Style>
</TextBox.Resources>
</TextBox>
</StackPanel>
</StackPanel>
<StackPanel Orientation="Vertical" Margin="20,0">
<StackPanel>
<TextBlock Text="Дата рождения" FontSize="12" FontFamily="Comic Sans MS" Foreground="#498C51"/>
<TextBox x:Name="date_birthday_textbox" Width="200" Height="30" Text="{Binding date_birthday}" Background="{x:Null}" BorderBrush="#498C51" BorderThickness="2" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" FontSize="15" FontFamily="Comic Sans MS">
<TextBox.Resources>
<Style TargetType="Border">
<Setter Property="CornerRadius" Value="10"/>
</Style>
</TextBox.Resources>
</TextBox>
</StackPanel>
<StackPanel Margin="0,10">
<TextBlock Text="Серия паспорта" FontSize="12" FontFamily="Comic Sans MS" Foreground="#498C51"/>
<TextBox x:Name="seria_passport" Width="200" Height="30" Text="{Binding series_passport}" Background="{x:Null}" BorderBrush="#498C51" BorderThickness="2" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" FontSize="15" FontFamily="Comic Sans MS">
<TextBox.Resources>
<Style TargetType="Border">
<Setter Property="CornerRadius" Value="10"/>
</Style>
</TextBox.Resources>
</TextBox>
</StackPanel>
<StackPanel>
<TextBlock Text="Номер паспорта" FontSize="12" FontFamily="Comic Sans MS" Foreground="#498C51"/>
<TextBox x:Name="number_passport" Width="200" Height="30" Text="{Binding number_passport}" Background="{x:Null}" BorderBrush="#498C51" BorderThickness="2" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" FontSize="15" FontFamily="Comic Sans MS">
<TextBox.Resources>
<Style TargetType="Border">
<Setter Property="CornerRadius" Value="10"/>
</Style>
</TextBox.Resources>
</TextBox>
</StackPanel>
<StackPanel Margin="0,10">
<TextBlock Text="Номер телефона" FontSize="12" FontFamily="Comic Sans MS" Foreground="#498C51"/>
<TextBox x:Name="number_phone" Width="200" Height="30" Text="{Binding number_phone}" Background="{x:Null}" BorderBrush="#498C51" BorderThickness="2" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" FontSize="15" FontFamily="Comic Sans MS">
<TextBox.Resources>
<Style TargetType="Border">
<Setter Property="CornerRadius" Value="10"/>
</Style>
</TextBox.Resources>
</TextBox>
</StackPanel>
<StackPanel>
<TextBlock Text="Электронная почта" FontSize="12" FontFamily="Comic Sans MS" Foreground="#498C51"/>
<TextBox x:Name="email" Width="200" Height="30" Text="{Binding email}" Background="{x:Null}" BorderBrush="#498C51" BorderThickness="2" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" FontSize="15" FontFamily="Comic Sans MS">
<TextBox.Resources>
<Style TargetType="Border">
<Setter Property="CornerRadius" Value="10"/>
</Style>
</TextBox.Resources>
</TextBox>
</StackPanel>
<StackPanel Margin="0,10">
<TextBlock Text="Номер полиса" FontSize="12" FontFamily="Comic Sans MS" Foreground="#498C51"/>
<TextBox x:Name="number_policy" Width="200" Height="30" Text="{Binding number_policy}" Background="{x:Null}" BorderBrush="#498C51" BorderThickness="2" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" FontSize="15" FontFamily="Comic Sans MS">
<TextBox.Resources>
<Style TargetType="Border">
<Setter Property="CornerRadius" Value="10"/>
</Style>
</TextBox.Resources>
</TextBox>
</StackPanel>
</StackPanel>
</WrapPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
<Grid Grid.Row="3" Background="#76E383">
<StackPanel Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Center">
<Button x:Name="save" Content="СОХРАНИТЬ" Background="#498C51" Width="130" Height="30" FontSize="15" FontFamily="Comic Sans MS" Margin="0,0,10,0" Click="save_Click" BorderBrush="{x:Null}">
<Button.Resources>
<Style TargetType="Border">
<Setter Property="CornerRadius" Value="10"/>
</Style>
</Button.Resources>
</Button>
<Button x:Name="back" Content="НАЗАД" Background="#498C51" Width="130" Height="30" FontSize="15" FontFamily="Comic Sans MS" Click="back_Click" IsCancel="True" BorderBrush="{x:Null}">
<Button.Resources>
<Style TargetType="Border">
<Setter Property="CornerRadius" Value="10"/>
</Style>
</Button.Resources>
</Button>
</StackPanel>
</Grid>
</Grid>
CS код:
using System.Windows;
using System.Windows.Controls;
using System.Windows.Navigation;
using Session1.Classes;
namespace Session1.Pages
{
/// <summary>
/// Логика взаимодействия для RedactorClient.xaml
/// </summary>
public partial class RedactorClient : Page
{
bool rewrite;
public RedactorClient(string id, int type_polic)
{
InitializeComponent();
if(id != null)
{
rewrite = true;
NFR.ItemsSource = Load.getDataClient(id);
comboboxPolicy.SelectedIndex = type_polic;
}
else
{
rewrite = false;
}
}
private void back_Click(object sender, RoutedEventArgs e)
{
NavigationService.Navigate(new MenuAdministator());
}
private void save_Click(object sender, RoutedEventArgs e)
{
if (rewrite == true)
{
Load.saveClient(NFR.ToString(), true);
}
else
{
Load.saveClient(NFR.ToString(), false);
}
}
}
}
Фоточки дебага:

DataContextокна, в этом классе сделайте публичное свойство коллекции, загрузите туда данные, а в XAML просто привяжите. – EvgeniyZ Dec 04 '22 at 18:29NFRэто что? Хм наверно<ItemsControl x:Name="NFR">? Данные вы от куда достать хотите?NFR.Items?NFR.ToString()(что за ерунда..?)? Другими словами, вы засунули в контрол данные и теперь с ним работаете, вытягивая из него нужное, когда как у вас должно это быть все раздельно. Даже вопрос у вас звучитКак получить значение всех элементов ItemsControl, что сразу показывает ваши намерения вытягивания данных из UI контрола. – EvgeniyZ Dec 04 '22 at 18:38NFR.ToString()для того, чтобы просто видеть в дебаге. Если я не ошибаюсь, я могу посмотреть содержимое не зависимо от метода, который вызову, будь тоToString()илиItems– gw gw Dec 04 '22 at 19:32publi List<Person> Persons { get; private set; }Дальше вы делаетеPersons = Load.getDataClient(id);, а где надо взять данные, то вы делаетеvar result = Persons....;. Ну а UI, если не хотите по уму, тоNFR.ItemsSource = Persons;, ну а по уму привязки, там тогда автоматом обновит все. – EvgeniyZ Dec 04 '22 at 19:36Другими словами, вы засунули в контрол данные и теперь с ним работаете, вытягивая из него нужное, когда как у вас должно это быть все раздельно, как понять раздельно? и как я с ним работаю, максимум для чего мне нужен контрол, засунуть значения в textbox-ы или вытащить если значения поменялись. Разве это не правильно? – gw gw Dec 04 '22 at 19:38DataContextи в XAML тогда уже писать<ItemsControl ItemsSource = "{Binding Persons}">, все... – EvgeniyZ Dec 04 '22 at 19:39Разве это не правильно?- вы правильный подход изначально отклонили. Правильный подход, это когда у вас нету вообщеx:Name, когда вы можете взять и удалить весь XAML и у проекта у вас будет работать без ошибок, когда вы можете заменить весь UI, например на консоль без каких-либо проблем, ну и так далее. Вот это все "Правильный подход". А когда вы работаете с контролами через C# код, это не правильный подход, это нарушение многих правил) – EvgeniyZ Dec 04 '22 at 19:41DataTableиспользуется, и привязки, и все в этом духе, прям минимальных, хороших пример того, как должно быть. Обратите внимание на то, что там нет ни единогоx:Name, мой C# код не знает вообще про XAML контролы, но все как видите прекрасно работает. – EvgeniyZ Dec 04 '22 at 19:45DataTableи его производные. 2. Из LINQ там только.Select(). – EvgeniyZ Dec 04 '22 at 19:56x:nameвы кнч не правы, в любом случае нужно использовать, чтобы при создании обработчиков событий, хотя бы понимать, что это за метод ты создал. Может у вас есть аргумент на этот счет? – gw gw Dec 05 '22 at 03:28x:Name, нет обработчиков событий, и прочего, это спокойно заменяется привязками, командами и прочими прелестями WPF. Считаете, что я не прав - делайте как знаете, пример я выше дал, который показал, что без контролов проект идеально работает, этого думаю достаточно для доказательств.INotifyChanged- он нужен если вы меняете свойство из кода во время работы приложения, достаточно найти любую удобную реализацию в интернете и ее использовать. "Мануал" - могу свои ответы посоветовать. – EvgeniyZ Dec 05 '22 at 11:42