2013-11-19 4 views
4

Я изучаю шаблон WPF MVVM. Я застрял в Binding CurrentCell из datagrid. В принципе мне нужен индекс строки и индекс столбца текущей ячейки.Как привязать CurrentCell в WPat datagrid с использованием шаблона MVVM

<DataGrid AutoGenerateColumns="True" 
      SelectionUnit="Cell" 
      CanUserDeleteRows="True" 
      ItemsSource="{Binding Results}" 
      CurrentCell="{Binding CellInfo}" 
      Height="282" 
      HorizontalAlignment="Left" 
      Margin="12,88,0,0" 
      Name="dataGrid1" 
      VerticalAlignment="Top" 
      Width="558" 
      SelectionMode="Single"> 

Вот мой ViewModel

private User procedureName = new User(); 

public DataGridCell CellInfo 
{ 
    get { return procedureName.CellInfo; } 
    //set 
    //{ 
    // procedureName.CellInfo = value; 
    // OnPropertyChanged("CellInfo"); 
    //} 
} 

Вот моя модель

private DataGridCell cellInfo; 

public DataGridCell CellInfo 
{ 
    get { return cellInfo; } 
    //set 
    //{ 
    // cellInfo = value; 
    // OnPropertyChanged("CellInfo"); 
    //} 
} 

И в моем ViewModel CellInfo всегда null. Я не могу получить значение от currentcell в datagrid. Пожалуйста, дайте мне знать, как получить CurrentCell в ViewModel.

if (CellInfo != null) 
{ 
    MessageBox.Show("Value is" + CellInfo.Column.DisplayIndex.ToString()); 
} 
+1

CurrentCell = "{Binding CellInfo}" - Попробуйте установить эту вещь в режим привязки в двух направлениях. –

+0

Почему вам нужна информация о ячейке, не можете ли вы привязаться к выбранному элементу сетки данных и извлекать нужные вам свойства? Кроме того, вызов Messagebox из вашей viewmodel будет создавать проблемы. Это было просто для тестирования? –

+0

Спасибо. Я попробовал с SelectedItem.Even selecteditem null в моем представлении model.yes messagebox предназначен только для тестирования. –

ответ

9

После того, как я быстро пошутил, я заметил очень простое решение вашей проблемы.

Прежде всего, есть две проблемы, а не одна здесь. Вы не можете связать CellInfo тип DataGridCell, его должно быть DataGridCellInfo, так как xaml не может преобразовать его самостоятельно.

Во-вторых, в вашем xaml вам нужно будет добавить Mode=OneWayToSource или Mode=TwoWay на ваш CellInfo переплет.

Вот грубый пример полу, связанные с вашим оригинальным кодом

XAML

<DataGrid AutoGenerateColumns="True" 
      SelectionUnit="Cell" 
      SelectionMode="Single" 
      Height="250" Width="525" 
      ItemsSource="{Binding Results}" 
      CurrentCell="{Binding CellInfo, Mode=OneWayToSource}"/> 

В.М.

private DataGridCellInfo _cellInfo; 
public DataGridCellInfo CellInfo 
{ 
    get { return _cellInfo; } 
    set 
    { 
     _cellInfo = value; 
     OnPropertyChanged("CellInfo"); 
     MessageBox.Show(string.Format("Column: {0}", 
         _cellInfo.Column.DisplayIndex != null ? _cellInfo.Column.DisplayIndex.ToString() : "Index out of range!")); 
    } 
} 

Просто небольшая подсказка - если вы отладить приложение и посмотреть на Окно вывода на самом деле говорит вам, есть ли какие-либо проблемы с вашими привязками.

Надеюсь, это поможет!

K.

+1

Большое спасибо kosdos.This работает хорошо, как предложено. Я пробовал то же самое раньше, но во время тестирования я пытался в butoon щелкнуть command.so всякий раз, когда я нажал на кнопку CurrentCell потерял фокус, это было причиной, по которой я всегда был null.Now i получил правильное значение, проверив внутри set.Also спасибо за ваш совет. –

+1

@kosdos '_cellInfo.Column.DisplayIndex! = Null? _cellInfo.Column.DisplayIndex.ToString() 'всегда будет true.BTW, как получить индекс строки seleted cell? – Chenxiao

+1

@Chenxiao Существует несколько способов извлечения индекса строки, вот несколько: - 'DataGrid' содержит свойство' SelectedIndex', если это работает правильно для вас (очень тонкое, если оно используется при переключении строк и, например, насколько я помню) – kosdos

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