C# WPF как получить доступ к нескольким textbox внутри datagrid?
Сразу скажу что я только учусь (самообучение), так вот у меня есть 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-ах, я так понял нужно что то переписать, но голова уже не соображает
Ответы (1 шт):
Автор решения: Damir
→ Ссылка
во-первых, в xaml коде, там, где нужные textbox, нужно было дописать:
<TextBox Width="100" Text="{Binding Path=TextBoxDonate, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
после чего написанное в данном текст боксе уже отображалось в поле TextBoxDonate, а именно:
var ordinal = e.OriginalSource;
if (ordinal is Button)
{
DataGridRow dataGrid = FindParent<DataGridRow>((DependencyObject)ordinal);
if (dataGrid != null)
{
int idx = lbMain.ItemContainerGenerator.IndexFromContainer(dataGrid);
var thisGame = Gamess[idx];
//thisGame.TextBoxDonate и есть наш textbox
}
}
