更改文本块文本仅适用于第一条记录
change textblock text Only applies to the first record
你好我里面有数据模板和文本块,我想当用户选中复选框时我的文本块文本更改我是这样做的:
<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 个文本块,通过选中每行中的复选框,必须更改该文本块的文本但我的代码仅适用于第一行
我认为这可能是因为您试图在整个数据网格中按名称查找文本块。它总是 return 它找到的第一个具有相同名称的控件。
您应该在复选框所在的行中找到文本块。
在您的方法中添加以下行:
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");
}
你好我里面有数据模板和文本块,我想当用户选中复选框时我的文本块文本更改我是这样做的:
<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 个文本块,通过选中每行中的复选框,必须更改该文本块的文本但我的代码仅适用于第一行
我认为这可能是因为您试图在整个数据网格中按名称查找文本块。它总是 return 它找到的第一个具有相同名称的控件。
您应该在复选框所在的行中找到文本块。
在您的方法中添加以下行:
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");
}