如果选中同一行中的某些复选框,我正在尝试编写一个代码,用于从文本框中获取3个值。 任何人都知道一种简单(或很难)的方法吗?
我的数据网格如下所示:
我有一个Load按钮,在文件系统的某处找到一个特定类型的文件(XML.config),然后我调用一个方法从该文件中获取一些字符串,找到它们的子串并将它们分成3个分隔名单。这些值在数据网格中为Type,MapTo和Name。 我通过将所有3个列表放在一个ObservableCollection中来完成此操作,之后我将ObservalableCollection发送到datagrid,如下所示:
ObservableCollection<Tuple<string, string, string>> _obsCollection = new ObservableCollection<Tuple<string, string, string>>();
public ObservableCollection<Tuple<string, string, string>> MyObsCollection
{
get { return _obsCollection; }
}
tabela.ItemsSource = _obsCollection;
这是显示绑定的XAML代码:
<DataGrid Grid.Column="0" AutoGenerateColumns="False" Height="206" HorizontalAlignment="Left" Margin="12,265,0,0" Name="tabela" VerticalAlignment="Top" Width="556" SelectionChanged="tabela_SelectionChanged" Grid.RowSpan="2" ItemsSource="Binding MyObsCollection">
<DataGrid.Columns>
<DataGridTextColumn Header="Type" Width="122" Binding="{Binding Item1}"/>
<DataGridTextColumn Header="MapTo" Width="122" Binding="{Binding Item2}"/>
<DataGridTextColumn Header="Name" Width="121" Binding="{Binding Item3}"/>
<DataGridTemplateColumn Header="Controller">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding DataGridChecked}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Service">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding DataGridChecked}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Injection">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding DataGridChecked}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
我实际上尝试的是完成循环所有包含复选框的3列以查看其中哪些被选中,如果选择了同一行中的3个中的任何一个,那么我需要将该行中的所有3个字符串值发送到一些变数。 任何人都可以帮助我。例如,我不知道如何从数据网格中的复选框获取isSelected属性。 我正在进行大量的研究,我能找到的只是DataGridView的示例,而DataGrid几乎没有。
答案 0 :(得分:2)
不要使用Tuple
创建自己的类,而是使用要显示为列的所有属性来说明RowData
:
public class RowData: INotifyPropertyChanged
{
//implement INotifyPropertyChanged
public string Type { get; set; }
public string MapTo { get; set; }
public string Name { get; set; }
public bool Controller { get; set; }
public bool Service { get; set; }
public bool Injection { get; set; }
}
更改ObservableCollection
以使用您的类型
public ObservableCollection<RowData> MyObsCollection { get { .... } }
并在AutoGenerateColumns="True"
DataGrid
<DataGrid
Grid.Column="0"
Grid.RowSpan="2"
AutoGenerateColumns="True"
Height="206"
Width="556"
HorizontalAlignment="Left"
Margin="12,265,0,0"
Name="tabela"
VerticalAlignment="Top"
SelectionChanged="tabela_SelectionChanged"
ItemsSource="{Binding MyObsCollection}"/>
然后获取您选择3 CheckBoxes
中任意一项的项目:
var selectedList = MyObsCollection.Where(n => n.Controller || n.Service || n.Injection).ToList();
答案 1 :(得分:0)
List<string>chzone=new List<string>();//Declare it as globally,
//Note: if DataGrid is Binded as ,Datagrid.Itemsource=dt.defaultview;
//If datagrid contain the Checkbox, get the checked item row and add it into list
private void DataGridcheckbox_Checked(object sender, RoutedEventArgs e)
{
var checker = sender as CheckBox;
if (checker.IsChecked == true)
{
var item = checker.DataContext as DataRowView;
object[] obj = item.Row.ItemArray;//getting entire row
chzone.Add(obj[0].ToString());//getting row of first column value
}
else //This is for Unchecked Scenario
{
var item = checker.DataContext as DataRowView;
object[] obj = item.Row.ItemArray;
bool res = chzone.Contains(obj[0].ToString());
if (res == true)
{
chzone.Remove(obj[0].ToString());//this is used to remove item in list
}
}
}