2015-02-20 7 views
0

Мне нужно получить значение ячейки от SelectedItem DataGrid.WPF DataGrid, получение значения ячейки

Вот DataGrid код XAML:

<DataGrid CanUserReorderColumns="false" CanUserAddRows="False" AutoGenerateColumns="False" Height="180" HorizontalAlignment="Left" Margin="6,11,0,0" Name="dataGridCards" VerticalAlignment="Top" Width="288" SelectionChanged="dataGridCards_SelectionChanged"> 
        <DataGrid.Columns> 
         <DataGridTextColumn Header="Card ID" Binding="{Binding cardID}" IsReadOnly="True"/> 
         <DataGridTextColumn Header="Card Name" Binding="{Binding cardName}" IsReadOnly="True"/> 
         <DataGridTextColumn Header="Set Mark" Binding="{Binding setMark}" IsReadOnly="True" Width="*"/> 
        </DataGrid.Columns> 
       </DataGrid> 

я блокировал столбец Переупорядочить и используется:

object row = dataGridCards.SelectedItem; 
cardName = (dataGridCards.SelectedCells[1].Column.GetCellContent(row) as TextBlock).Text; 

DataGrid отображает соединение двух таблиц. Мне действительно не нравится это решение, я предпочитаю не блокировать переупорядочивание. Как я могу получить значение ячейки без переупорядочения блоков? Нужно ли определять некоторые шаблоны для строк DataGrid?

+1

Я действительно не понимаю вашу проблему ... не можете ли вы просто получить доступ к 'row.PropertyName', чтобы найти значение вашей ячейки? – Sheridan

+0

Я не вижу свойств. – pochmurnik

+0

Какие типы объектов у вас есть в 'DataGrid'? – Sheridan

ответ

0

Я подготовил класс для заполнения dataGrid:

class RowCardSet 
{ 
    private int cardID; 
    private String cardName; 
    private String setMark; 

    public RowCardSet(int cardID, String cardName, String setMark) 
    { 
     this.cardID = cardID; 
     this.cardName = cardName; 
     this.setMark = setMark; 
    } 

    public int CardID 
    { 
     get { return this.cardID; } 
     set { this.cardID = value; } 
    } 

    public String CardName 
    { 
     get { return this.cardName; } 
     set { this.cardName = value; } 
    } 

    public String SetMark 
    { 
     get { return this.setMark; } 
     set { this.setMark = value; } 
    } 
} 

В этом случае я также необходимо изменить Связывание в dataGrid. Из cardID, cardName, setMark к CardID, CardName и SetMark:

<DataGrid.Columns> 
    <DataGridTextColumn Header="Card ID" Binding="{Binding CardID}" IsReadOnly="True"/> 
    <DataGridTextColumn Header="Card Name" Binding="{Binding CardName}" IsReadOnly="True"/> 
    <DataGridTextColumn Header="Set Mark" Binding="{Binding SetMark}" IsReadOnly="True" Width="*"/> 
</DataGrid.Columns> 

Вот запрос для заполнения dataGrid:

public static List<RowCardSet> GetCardSetList(int setID, DataContext dataContext) 
    { 
     return (from cardItem in dataContext.Cards 
       join setItem in dataContext.Sets 
       on cardItem.setID equals setItem.setID 
       where cardItem.setID == setID 
       select new RowCardSet(
        cardItem.cardID, 
        cardItem.cardName, 
        setItem.setMark)).ToList(); 
    } 

Так что теперь я могу заполнить, используя этот метод: dataGridCards.ItemsSource = Queries.GetCardSetList(setID, dataContext);

и получение определенного значения выглядит следующим образом:

String cardName = ((RowCardSet)dataGridCards.SelectedItem).CardName.ToString(); 
0

Вы можете запросить заголовок столбца, чтобы найти текущий индекс, а затем использовать это:

object row = dataGridCards.SelectedItem; 
int columnIndex = dataGridCards.Columns.Single(c => c.Header.Equals("Card Name")).DisplayIndex; 
String cardName = (dataGridCards.SelectedCells[columnIndex].Column.GetCellContent(row) as TextBlock).Text; 
+0

Я решил это, добавив свой собственный тип для строк. – pochmurnik

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