2009-04-19 3 views
8

ListBox를 가지고 있는데, 이는 ObservableCollection에 바인딩되어 있습니다.DataTemplates가 포함 된 WPF ListBoxItem - DataTemplate 내에서 ListBoxItem에 바인딩 된 CLR 개체를 참조하려면 어떻게해야합니까?

ListBoxItemDataTemplate으로 표시됩니다. 내 DataTemplate에있는 버튼을 클릭하면 해당 버튼이 ObservableCollection의 멤버에 대한 참조가 필요합니다.이 버튼은 DataTemplate의 일부입니다. 단추를 클릭 할 때 항목이 선택되지 않기 때문에 ListBox.SelectedItem 속성을 사용할 수 없습니다.

그래서 : 마우스를 움직이거나 버튼을 클릭 할 때 ListBox.SelectedItem을 올바르게 설정하는 방법을 알아야합니다. 또는 단추가 속한 ListBoxItem에 바인딩 된 CLR 개체에 대한 참조를 가져 오는 다른 방법을 찾아야합니다. 두 번째 옵션은 더 깨끗해 보이지만, 어느 쪽이든 괜찮습니다. 아래

간체 코드 세그먼트 :

XAML :

<DataTemplate x:Key="postBody"> 
    <Grid> 
     <TextBlock Text="{Binding Path=author}"/> 
     <Button Click="DeleteButton_Click">Delete</Button> 
    </Grid> 
</DataTemplate> 

<ListBox ItemTemplate="{StaticResource postBody}"/> 

C 번호 :

private void DeleteButton_Click(object sender, RoutedEventArgs e) 
{ 
    Console.WriteLine("Where mah ListBoxItem?"); 
} 

답변

11

일반적으로 사람들이 직접 ListBoxItem 아닌 실제에 결합 CLR 개체에 관심이있을 것 ListBoxItem. 당신은 예를 들어 게시물의 목록을 가지고 있다면 당신은 당신의 기존 템플릿 사용할 수 있습니다

<DataTemplate x:Key="postBody" TargetType="{x:Type Post}"> 
    <Grid> 
    <TextBlock Text="{Binding Path=author}"/> 
    <Button Click="DeleteButton_Click">Delete</Button> 
    </Grid> 
</DataTemplate> 
<ListBox ItemTemplate="{StaticResource postBody}" 
    ItemSource="{Binding Posts}"/> 

를하고 코드 숨김, 당신의 ButtonDataContextDataContextDataTemplate 같다 '. 이 경우 Post입니다.

private void DeleteButton_Click(object sender, RoutedEventArgs e){ 
    var post = ((Button)sender).DataContext as Post; 
    if (post == null) 
    throw new InvalidOperationException("Invalid DataContext"); 

    Console.WriteLine(post.author); 
} 
+0

이것은 완벽하며 내 질문의 문구도 수정할 수 있습니다. 당신이 맞다면 편집 할 것이고, 나는 ListBoxItem 자체가 아니라 바운드 CLR 객체에 관심이 있습니다. –

3

수행해야 할 작업에 따라 여러 가지 가능성이 있습니다.

먼저, 주요 질문은 "왜 이것을 필요로합니까?"입니다. 대부분의 경우 컨테이너 항목에 대한 참조가 실제로 사용되지는 않습니다 (이 경우는 귀하의 사례는 아니지만 정교해야합니다). 귀하의 목록 상자를 데이터 바인딩하는 경우, 거의 그 경우가 있습니다.

두 번째로 목록 상자의 이름이 MyListBox 인 경우 myListBox.ItemContainerGenerator.ContainerFromItem()을 사용하여 목록 상자에서 항목을 가져올 수 있습니다.

Container = sender as FrameworkElement; 
if(sender != null) 
{ 
    MyItem = Container.DataContext as XXX; 
    MyElement = MyListBox.ItemContainerGenerator.ContainerFromItem(MyItem); // <-- this is your ListboxItem. 
} 

당신은 예를 들어 this blog을 찾을 수 있습니다 (XXX 당신의 유형 바인딩 데이터 임) 보낸 사람 매개 변수에서, 당신은 예를 들어,를 통해 템플릿 된 실제 항목을 다시 얻을 수 있습니다. 그녀는 인덱스 메서드를 사용하지만 Item 메서드는 비슷합니다.

+0

원래의 질문에 대한 답변입니다. bendewey는 내가했던 말을 의미하지는 않는다고 올바르게 가정했다. 그러나 이것은 또한 인정 받는다. 투표했습니다. –

관련 문제