2013-09-03 3 views
1

У меня есть приложение WPF, которое содержит datagrid. Он привязан к моему объекту List «Orders», показанному ниже.WPF Datagrid Double Click Cell MVVM Design

public class OrderBlock 
{ 
    public Settings setting; 
    public List<Order> orders; 
} 
public class Order 
{ 
    public int Amount; 
    public string OrderID; 
    public string OrderIDDup; 
    public string Name; 
    public string NameDup; 
    public bool DupIDs; 
    // and some string, int fields 
} 

По причинам вне моего контроля не исключено, что может быть больше, чем один OrderID, следовательно, свойство OrderIDDup. Мой datagrid по умолчанию показывает только OrderID, а не OrderIDDup.

Я хотел бы сделать так, чтобы пользователь мог нажать на идентификатор ячейки и загрузить другое окно, чтобы показать им другой идентификатор, а также два имени и позволить им выбрать, какой идентификатор следует использовать ,

Я читал, что WPF DataGrid не поддерживает эту функциональность двойного щелчка по ячейке. Поэтому я немного потерялся, так как я должен начать заниматься этой проблемой. Другая проблема, которую я вижу, заключается в том, что, когда я пытаюсь (будучи оперативным словом) использовать MVVM-дизайн, как это событие может быть подвергнуто моей модели просмотра?

Также это лучший способ показать такую ​​информацию.

Любая помощь будет большим, Спасибо, M

+0

как насчет rightclick? или используя обычный clickevent с таймером и счетчиком ala 'if (cell = oldcell && time WiiMaxx

+0

' RowDetails' может быть другим способом достижения этого – Shoe

+0

Я согласен с @jim Rowdetails - это способ идти.Тогда вы можете иметь выпадающее меню, кнопку или все, что вы хотите для выбора значений. Какую структуру mvvm вы используете. В Mvvm-Light есть событие, которое вы можете использовать для привязки событий, связанных с пользовательским интерфейсом, к функциям viewmodel и сохранению шаблона MVVM. –

ответ

21

Вместо двойного щелчка по ячейке, вы можете дважды щелкнуть на сетке

<DataGrid.InputBindings> 
     <MouseBinding Gesture="LeftDoubleClick" Command="{Binding Edit}" CommandParameter="{Binding ElementName=UsersDataGrid, Path=SelectedItem}" /> 
    </DataGrid.InputBindings> 

В ViewModel

public ICommand Edit { get; private set; } 

Edit = new RelayCommand(EditUser, x => _isAdmin); 



private static void EditUser(object usr) 
    { 
     if (!(usr is User)) 
      return; 

     new UserEditorViewModel(usr as User); 
    } 
+0

Извините, я не очень хорошо разбираюсь в WPF. Если они дважды щелкнут по сетке, как мне определить, в какую строку они нажали? Я понимаю часть ICommand. – mHelpMe

+0

CommandParameter = "{Binding ElementName = UsersDataGrid, Path = SelectedItem} – bobah75

+0

В вашем обработчике Команда будет выбирать элемент как параметр – bobah75

0

I'v использовали MouseDoubleClick:

private void DataGrid_MouseDoubleClick(object sender, MouseButtonEventArgs eventArgs) 
    { 
     if (sender == null) return; 
     if (eventArgs.ButtonState != MouseButtonState.Pressed) return; //only react on pressed 

     var dataGrid = sender as DataGrid; 
     if (dataGrid == null || dataGrid.SelectedItems == null) return; 

     if (dataGrid.SelectedItems.Count == 1) 
     { 
      var simplePension = dataGrid.SelectedItem as ISimplePension; 
      if (simplePension != null) 
      { 
       DataFetcherHolder.DataFetcher.SelectPension(simplePension); 
       Execute(EditSelectedPensionFunction); 
      } 
     } 
    } 

Когда вы дважды щелкаете по сетке данных, строка также выбирается, поэтому я просто нахожу выбранный элемент и использую его.

1
private void DataGrid_MouseDoubleClick(object sender, MouseButtonEventArgs eventArgs) 
{ 
    if (sender == null) return; 
    if (eventArgs.ButtonState != MouseButtonState.Pressed) return; //only react on pressed 

    var dataGrid = sender as DataGrid; 
    if (dataGrid == null || dataGrid.SelectedItems == null) return; 

    if (dataGrid.SelectedItems.Count == 1) 
    { 
     var simplePension = dataGrid.SelectedItem as ISimplePension; 
     if (simplePension != null) 
     { 
      DataFetcherHolder.DataFetcher.SelectPension(simplePension); 
      Execute(EditSelectedPensionFunction); 
     } 
    } 
} 
1

Мы можем сделать это двумя способами,

а) Используя свойство зависимостей б) Добавив System.Windows.Interactivity.dll.

Обычно я предпочитаю второй способ.

Шаг 1: Внедрите интерфейс ICommand в файл класса модели вашего вида.

шаг 2: Определите команды,

public ICommand DoubleClickCommand 
{ 
//Do your code 
} 

шаг 2: добавьте сказанное .dll в файл XAML вашего соответствующего решения в.

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 

шаг 3: Внутри DataGrid тега, используйте приведенный ниже код для реализации InvokeCommandAction класса

<i:Interaction.Triggers> 
     <i:EventTrigger EventName="MouseDoubleClick"> 
      <i:InvokeCommandAction Command="DoubleClickCommand"/> 
     </i:EventTrigger> 
<i:Interaction.Triggers> 

Вот так. Надеюсь, это вам поможет :)