2013-03-08 10 views
2

얼마 전에이 tutorial으로 MVVM 패턴을 연구하기 시작했습니다. 나는 MicroMvvm을 사용한다.WPF DataGrid의 현재 요소를 가져 오는 방법과 함께 DataGrid로 무언가를 처리하는 방법은 무엇입니까?

EntityFramework 모델을 사용하는 WPF 프로젝트가 있습니다. ViewModels 및 XAML 뷰를 작성했습니다. . 내가 데이터 그리드 내 데이터를 표시 할 : 내 LibraryViewModel.cs에서

<DataGrid Height="250" ItemsSource="{Binding Books}" AutoGenerateColumns="False" > 
    <DataGrid.Resources> 
     <DataTemplate x:Key="DeleteTemplate" > 
      <Button x:Name="DeleteButton" Command="{Binding DeleteBook, Mode=OneWay}" CommandParameter="{Binding}" >Delete</Button> 
     </DataTemplate> 
    </DataGrid.Resources> 
    <DataGrid.Columns> 
     <DataGridTextColumn Binding="{Binding Title}" Header="Book"/> 
     <DataGridTextColumn Binding="{Binding Author}" Header="Author"/> 
     <DataGridTemplateColumn CellTemplate="{StaticResource EditTemplate}" Header="Редактировать"/> 
     <DataGridTemplateColumn CellTemplate="{StaticResource DeleteTemplate}" Header="Удалить"/> 
    </DataGrid.Columns> 
</DataGrid> 

을 (데이터 2 열 및 2 buttoncolumn 편집, 삭제)

#region Commands 
void DeleteBookExecute() 
{ 
    if (_books == null) 
     return; 

    //MessageBox.Show("This is delete button. Delete item id:" myMysticalObjectFromCommandParameter); 
} 
bool CanDeleteBookExecute() 
{ 
    return true; 
} 
public ICommand DeleteBook 
{ 
    get 
    { 
     return new RelayCommand(DeleteBookExecute, CanDeleteBookExecute); 
    } 
} 

나는 버튼을 눌러

(삭제/edit) 현재 객체를 삭제/편집하고 싶습니다. MVVM에서이를 수행하는 방법을 모르겠습니다.

Command="{Binding DeleteBook, Mode=OneWay}" CommandParameter="{Binding}"으로 처리 할 수 ​​있습니까?

올바른 경우 내 LibraryViewModel에서 CommandParameter의 데이터를 가져올 수 있습니까?

답변

2

DHN에서 말한 것처럼 명령 실행 방법 DeleteBookExecute(), CanDeleteBookExecute()에는 object 유형의 매개 변수가 있어야합니다.

아이디어가 올바른 방향을 가리키고 있습니다. 이 시도 :

<DataGrid Name="LibraryGrid" 
      Height="250" 
      ItemsSource="{Binding Books}" 
      AutoGenerateColumns="False" > 

DataContext.DeleteBookElementName의 사용은 LibraryViewModel의 명령을 얻을 수
Command="{Binding DataContext.DeleteBook, ElementName=LibraryGrid}" CommandParameter="{Binding}" 

.

+0

LibraryViewModel.cs에서이 개체를 어떻게 가져올 수 있는지 이해할 수 없습니다. void DeleteBookExecute() {?}. 그런 식으로이 방법을 다시 작성 하시겠습니까? void DeleteBookExecute (object param) param에 내 행 객체가 있습니까? 그렇지 않다면 ... – chromigo

+0

@chromigo : 그래야합니다. 매개 변수는 WPF 마법에 의해 자동으로 전달됩니다 ... – Marc

+0

도움을 주셔서 감사합니다. MicroMvvm 메서드를 변경하면 (DHN이 말한 것처럼 1 param을 취함) evrything이 효과가있었습니다. – chromigo

2

명령 메서드에 매개 변수가 없다는 것이 약간 궁금합니다. 나는이 VM의 속성에 DataGridSelectedItem 속성을 결합하는 것, 그들이 그럼에도 불구하고이

void DoSomething(object param) {} 
bool CanDoSomething(object param) {} 

같이 기대. 좀 더 자세한 정보를 원하시면 pls는 here입니다.

<DataGrid ItemsSource={Binding Books} SelectedItem={Binding SelectedBook} /> 

이렇게하면 명령에서 '현재'항목에 쉽게 액세스 할 수 있습니다.

희망이 조금 도움이됩니다.

+0

감사합니다. – chromigo