嗨,我里面有数据板和文本块,我想当用户选中我的文本块时,我是这样做的:
<DataGridTemplateColumn Header="نمره" MinWidth="150" Width="auto">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Vertical" Margin="5" HorizontalAlignment="Right" ToggleButton.Checked="StackPanel_Checked">
<Metro:MetroSwitch Checked="chkChecked_Checked" Tag="exc" Margin="0,2">خیلی خوب</Metro:MetroSwitch>
<Metro:MetroSwitch Checked="chkChecked_Checked" Tag="good" Margin="0,2">خوب</Metro:MetroSwitch>
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="وضعیت" MinWidth="100" Width="auto">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate x:Name="myDataTemplate">
<StackPanel Orientation="Vertical" Margin="5" HorizontalAlignment="Center">
<Metro:MetroTextBlock Text="ثبت نشده" Foreground="Red" Name="txtStatus"/>
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
和代码隐藏:
private void chkChecked_Checked(object sender, RoutedEventArgs e)
{
Arthas.Controls.Metro.MetroTextBlock temp = FindVisualChildByName<Arthas.Controls.Metro.MetroTextBlock>(dataGrid, "txtStatus");
switch ((sender as Arthas.Controls.Metro.MetroSwitch).Tag.ToString())
{
case "exc":
temp.Foreground = new SolidColorBrush(Colors.Green);
temp.Text = "شده";
break;
case "good":
temp.Foreground = new SolidColorBrush(Colors.Green);
temp.Text = "شده";
break;
}
}
但问题是只有第一个记录才会改变
每条记录包含2个复选框和1个文本块,通过选择每行中的复选框,必须更改该文本块的文本,但我的代码只适用于第一行。
发布于 2018-05-04 11:09:10
我认为这可能是因为您试图在整个dataGrid中按名称查找文本块。它将始终返回具有相同名称的第一个控件。
您应该在复选框所在的行中找到textblock。
在您的方法中添加以下行:
private void chkChecked_Checked(object sender, RoutedEventArgs e)
{
// this will find the datagrid item
var row = dataGrid.ContainerFromElement(sender as DependencyObject);
// now use this datagrid item to find your textblock
Arthas.Controls.Metro.MetroTextBlock temp = FindVisualChildByName<Arthas.Controls.Metro.MetroTextBlock>(row, "txtStatus");
}
https://stackoverflow.com/questions/50172713
复制相似问题