2014-12-17 17 views
0

WPF의 경우 : 어떻게 ItemsSource 루프의 인덱스를 CommandParameter로 전달할 수 있습니까?ItemsSource의 인덱스를 WPF의 CommandParameter로 전달하는 방법

<ItemsControl ItemsSource="{Binding PageList}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <Button 
       Content="{Binding Name}" 
       Command="{Binding DataContext.ChangePageCommand, ElementName=Window}" 
       CommandParameter="INDEX OF ACTUAL ITEM AT ITEMSSOURCE GOES HERE" /> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

그래서 원하는 푸시 버튼 번호를 Command 메소드로 전달해야합니다.

감사합니다.

+0

아이템의 'DataContext'를 사용할 수 없습니까? –

+0

귀하의 pageviewmodel에서 상위 콜렉션의 인덱스를 반환하는 속성을 생성 할 수 있습니까? 그 다음 명령 매개 변수에 해당 번호를 전달할 수 있습니다. – Krishna

답변

0

간단한 방법.

먼저, 스크류 색인. 그들은 빨아. 이제 SelectedItem

<ItemsControl ItemsSource="{Binding PageList}" SelectedItem="{Binding SelectedPage}"> 

에 바인딩, 당신은 선택한 페이지가 뷰 모델에 이미 있기 때문에, 시도하고 매개 변수로 인덱스를 통과 할 필요가 없습니다.

// set in the ctor 
public ObservableCollection<Page> PageList {get;private set;} 
// Omitting INPC stuff in the setter 
public Page SelectedPage {get;set;} 

// Here's the Execute method of the ICommand 
private void ExecuteChangePageCommand(object parameter) 
{ 
    // lol screw the parameter 
    var currentPage = SelectedPage; 
    UpdateSelectedPageOrDoWhateverLolKthx(currentPage); 
} 
+0

ItemsControl의 "SelectedItem"속성을 사용할 수 없습니다 ... – MorgoZ

+0

어떤 경우이든 선택한 페이지를 가져 오는 방법을 찾고 있지 않습니다. 버튼을 밀었습니다. 각 항목은 목록에서 해당 위치를 알지 못하기 때문에 목록에서의 위치 및 DataContext 사용은 옵션이 아닙니다. – MorgoZ

+0

@MorgoZ ah 버거. 나는 ListBox를 사용하는 데 익숙하다. 매우 이상하게 보이는 "목록의 위치"에 관해서. ViewModel이 UI에서 항목의 위치를 ​​신경 쓰는 이유는 무엇입니까? 일반적인 패턴은 "사용자가 무언가를 선택하고, 사용자가 무언가를 작업하며, 사용자가 VM에 무언가를 수행하도록 지시합니다." 당신은 무엇을 위해 색인을 사용하고 있습니까? – Will