2014-02-11 2 views
2

Я пытаюсь написать код для получения 3 значений из текстовых полей, если отмечены некоторые флажки в одной строке. Кто-нибудь знает простой (или жесткий) способ сделать это?Получение значения целой строки, если флажок установлен в datagrid C#

Моя DataGrid выглядит следующим образом: enter image description here

У меня есть кнопка Load, которая находит файл определенного типа (XML.config) где-то в файловой системе, после того, что я звоню метод, который получает некоторые строки из этого файл, найдите подстроки из них и поместите их в 3 отдельных списка. Эти значения указаны в datagrid как 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 строковых значения из этой строки в некоторую переменную. Любой может мне помочь. Например, я не знаю, как получить свойство isSelected из флажка в сетке данных. Я проводил много исследований, и все, что я смог найти, было примером для DataGridView и почти ничего для DataGrid.

+0

'ObservableCollection >' - Вы действительно должны создать правильные сильно типизированных модели данных вместо того, чтобы монстр, пожалуйста. –

+0

@HighCore благодарит за комментарий ... Я все еще новичок, и я не знаю, как это сделать ... Возможно, вы знаете какие-то хорошие ссылки или учебные пособия о создании модели данных? Я знаю, что такой код грязный, но я все еще пытаюсь сумасшедшие вещи и исследую их. –

ответ

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(); 
+0

@dkozi Я сделал все так, но теперь я получаю пустой datagrid только с одной строкой. Должен ли я оставить все привязки строк текстового поля, как они используются, и привязать ли строки флажка к свойствам Controller, Service и Injection? –

+1

Сделал это, связывание было неправильно, потому что теперь у меня есть новые имена, а Item1, Item2 и Item3 больше не могут использоваться для привязки. Большое вам спасибо за помощь. –

+0

Нет проблем. Рад, что это помогло – dkozl

Смежные вопросы