Сразу скажу что я только учусь (самообучение), так вот у меня есть DataGrid в котором есть кнопка и 2 textbox-а, я получил доступ к кнопке и первому textbox-у, не могу понять как получать доступ к 2-му texbox?
xaml:
<Grid Margin="10">
<StackPanel Margin="5">
<Grid Margin="10" HorizontalAlignment="Center">
<Button Name="buttonAddGame" Width="100" HorizontalAlignment="Left" Content="Добавить Игру" Click="buttonAddGame_Click"/>
<TextBox Name="textAddGame" Width="100" materialDesign:HintAssist.Hint="новая игра" HorizontalAlignment="Left" Margin=" 130 0 0 0"/>
<Button Name="update" Width="100" HorizontalAlignment="Right" Content="Обновить" Click="update_Click" Margin="350 0 0 0" Cursor="Hand" />
</Grid>
<DataGrid x:Name="lbMain" Margin="10" Width="auto" AutoGenerateColumns="False" VerticalAlignment="Top" HorizontalAlignment="Center" IsReadOnly="True" >
<DataGrid.Columns>
<DataGridTextColumn Header="Игра" Binding="{Binding Path='Name'}" IsReadOnly="True" />
<DataGridTextColumn Header="Донат" Binding="{Binding Path='Donate'}" IsReadOnly="True" />
<DataGridTextColumn Header="Голос" Binding="{Binding Path='Poll'}" IsReadOnly="True" />
<DataGridTextColumn Header="Время Стрима" Binding="{Binding Path='StreamTime'}" IsReadOnly="True" />
<DataGridTemplateColumn Header="" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Name="btnChange" Content="Изменить" Click="btnChange_Click" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="+ Донат" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox x:Name="textUpdateDonate" Width="100" Text="" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="+ Голос" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox x:Name="textUpdatePoll" Width="100" Text="" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
<Button Margin="0 50 0 0" x:Name="close" Content="Выйти" Width="100" HorizontalAlignment="Center" Click="close_Click" Background="#FFFDFDFD" BorderBrush="White" Foreground="#DD6F6F6F" Cursor="Hand"/>
</StackPanel>
</Grid>
C#:
private void btnChange_Click(object sender, RoutedEventArgs e)
{
//var dataRow = (Game)((Button)e.Source).DataContext;
object ordinal = e.OriginalSource;
DataGrid dataGrid = FindParent<DataGrid>((DependencyObject)ordinal);
TextBox tb = FindVisualChild<TextBox>(dataGrid);
MessageBox.Show(tb.Text);
}
private void close_Click(object sender, RoutedEventArgs e)
{
Environment.Exit(0);
}
private void update_Click(object sender, RoutedEventArgs e)
{
lbMain.Items.Refresh();
}
public static parentItem FindParent<parentItem>(DependencyObject obj)
where parentItem : DependencyObject
{
DependencyObject objToRet = obj;
while (!(objToRet is parentItem))
{
objToRet = VisualTreeHelper.GetParent(objToRet);
if (objToRet == null) return null;
}
return (parentItem)objToRet;
}
public static childItem FindVisualChild<childItem>(DependencyObject obj)
where childItem : DependencyObject
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(obj, i);
if (child != null && child is childItem)
return (childItem)child;
else
{
childItem childOfChild = FindVisualChild<childItem>(child);
if (childOfChild != null)
return childOfChild;
}
}
return null;
}
}
Класс Game:
public string Name
{
get { return name; }
set
{
name = value;
OnPropertyChanged("Name");
}
}
public double Donate
{
get { return donate; }
set
{
donate = value;
OnPropertyChanged("Donate");
}
}
public int Poll
{
get { return poll; }
set
{
poll = value;
OnPropertyChanged("Poll");
}
}
public double StreamTime
{
get { return streamTime; }
set
{
streamTime = value;
OnPropertyChanged("StreamTime");
}
}
public string TextBoxDonate
{
get { return textBoxDonate; }
set
{
textBoxDonate = value;
OnPropertyChanged("TextBoxDonate");
}
}
public string TextBoxPoll
{
get { return textBoxPoll; }
set
{
textBoxPoll = value;
OnPropertyChanged("TextBoxPoll");
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged([CallerMemberName] string prop = "")
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(prop));
}
собственно по нажатию на кнопку я хочу получить доступ к тексту который введен в обоих textbox-ах, я так понял нужно что то переписать, но голова уже не соображает

DataContext = класс;, гдеклассэто простой класс с нужными публичными свойствами для привязки, далее в XAML всеx:Nameзаменяете на привязки к нужным свойствам, напримерx:Name="lbMain"меняете наItemsSource = "{Binding Items}"(Items - свойство коллекции в классе), все, у вас несколько строк кода, вы не делаете костыли по типу поиска элемента, не храните данные в UI, у вас все на своих местах и все как надо. Имея это уже дальше можете работать, напримерClickзаменить наCommand, тогда передача данных будет простоCommandParameter = "{Binding}". – EvgeniyZ Nov 20 '22 at 11:16я только учусь- по этой причине я и говорю вам, что вы делаете все не так, научитесь сразу использовать WPF правильно.больше кода для примера- куда еще больше?) Я вам считай пошаговую инструкцию дал, можете посмотреть также мои ответы по WPF, там найдете кучу полезного. Зовется это все "Привязки". Вы начните делать, а если возникнут вопросы, пишите, помогу. – EvgeniyZ Nov 20 '22 at 11:31new Game();? Как в C# инициализируются классы? Ну иDataContextдолжен задаваться классу окна (про это я забыл сказать). – EvgeniyZ Nov 20 '22 at 11:40Click- это событие, стандартное, простое событие, его аналогом в привязках являются команды, где вы в классе делаете публичное свойство (помним, что привязки доступны только к ним) с типомICommand, далее вам нужно реализовать эту команду любым удобным для вас способов, например можно взять от сюда классRelayCommand, дальше вам надо создать эту команду, указав какой метод будет использоваться. В XAML вы привязываете команду (Command = "{Binding MyCommand}"), ну и передаете параметры черезCommandParameter. – EvgeniyZ Nov 20 '22 at 12:13{Binding}- если не указано чего либо, то это означает "Текущий объект целиком", в вашем случае это будетGame, значит и в команде получайте типGame. Если нужно конкретное значение, то указывайте его, например{Binding Name}, будет вам имя, в обработчике команды тип тогдаstring. – EvgeniyZ Nov 20 '22 at 12:15