2013-10-15 3 views
0

여기에 간단한 목록 상자가 있습니다 : link to image 데이터를 바인딩했습니다. 이제는 한 항목 (한 행)을 탭하면 목록 상자 항목/행이 선택/보라색으로 표시되지만 실제로이 항목은 행 변경 색만 선택되어 있지 않지만 이미지 나 텍스트를 클릭하면 내가 선택한 부분이 아닌 행을 선택/바이올린이지만 코드의 항목이 선택되었습니다. 내가하는 말을 이해하는지 확신 할 수 없다. 간단히 말해 빈 공간 행을 클릭하면 행이 시각적으로 선택되지만 발신자는 목록 상자 항목과 같은 데이터를 가져 오지 않습니다. 텍스트 나 이미지를 클릭하면 보낸 사람이 데이터를 가져 오지만 시각적으로 선택되지는 않습니다. 행을 클릭하면 행을 선택할 수 있습니다. 예를 들어 바이올렛 및 항목을 보낸 사람이 데이터를 가져 옵니까?목록 상자에서 선택된 항목을 데이터 템플릿으로 바인딩하기

내 두 번째 질문은 내 직사각형이 선과 같이 사용되는 이유입니다. 텍스트처럼 최대 너비가 있습니다.이 사각형을 목록 상자의 전체 너비로이 가능하게 할 수 있습니까?

XAML :

<ListBox x:Name="lbMessagesUsersList" Foreground="Black" ItemsSource="{Binding MyDatasMessagesUserList }"> 
       <ListBox.ItemTemplate> 
        <DataTemplate> 
         <ListBoxItem Tapped="userTapped" Tag="{Binding}" > 
          <StackPanel> 
           <Grid> 
            <Grid.ColumnDefinitions> 
             <ColumnDefinition Width="50"/> 
             <ColumnDefinition Width="*"/> 
            </Grid.ColumnDefinitions> 
            <Image Grid.Column="0" Source="{Binding MessengeHisPhoto}" HorizontalAlignment="Left" Width="40" Height="40" Margin="5,-18,0,-18" Stretch="Fill" ></Image> 
            <TextBlock x:Name="tbMessengerName" Text="{Binding MessengeFullName}" HorizontalAlignment="Left" 
             Grid.Column="1" Margin="25,0,0,0"/> 
           </Grid> 
           <Rectangle Height="1" Margin="0,0,0,-38" HorizontalAlignment="Stretch"> 
            <Rectangle.Fill> 
             <SolidColorBrush Color="Black"/> 
            </Rectangle.Fill> 
           </Rectangle> 
          </StackPanel> 
         </ListBoxItem> 
        </DataTemplate> 
       </ListBox.ItemTemplate> 
      </ListBox> 

CS :.

private void userTapped(object sender, TappedRoutedEventArgs e) 
    { 
     var button = sender as ListBoxItem; 
     if (button != null) 
     { 
      var subject = MyDatasMessagesUserList.FirstOrDefault(sub => sub == button.Tag); 
      if (subject != null) 
      { 
       IdOfChoosenUser = subject.MessengeIdUser; 
      } 
     }... 

나는 또한 ListBoxItem의 제거하려고 너무 StackPanel에에 태그 만이 그나마 작업을 바인딩 설정 {

답변

2

참고 사용할 때, 그 ItemTemplate 인 경우 각 항목은 ListBoxItem에 래핑됩니다. 따라서 템플릿에 ListBoxItem을 사용하면 안됩니다. 두 개의 중첩 상자가 만들어지기 때문입니다. 과 같이, 그것을 제거 시도해보십시오 들어

private void userTapped(object sender, TappedRoutedEventArgs e) 
{ 
    var selectedItem = lbMessagesUsersList.SelectedItem; 
    var subject = MyDatasMessagesUserList.FirstOrDefault(sub => sub == selectedItem); 
} 

: 핸들러를 들어

<ListBox.ItemTemplate> 
    <DataTemplate> 
     <StackPanel Tapped="userTapped" Tag="{Binding}"> 
      <!-- content here --> 
     </StackPanel> 
    </DataTemplate> 
</ListBox.ItemTemplate> 

을 단순히 대신 Tag (감사 @MetroSmurf)를 사용하려고 시도의 이름으로 목록 상자를 참조하는 것이 더 쉬울 수 있습니다 질문의 두 번째 부분 : 항목을 늘리려면 ListBoxItem 래퍼를 늘려야합니다.

<ListBox> 
    <ListBox.ItemContainerStyle> 
     <Style TargetType="ListBoxItem"> 
      <Setter Property="HorizontalAlignment" Value="Stretch" /> 
      <Setter Property="HorizontalContentAlignment" Value="Stretch" /> 
     </Style> 
    </ListBox.ItemContainerStyle> 
</ListBox> 
+2

는 StackPanel' 확인 및 단지 액세스'lbMessagesUsersList.SelectedItem'으로 '보낸 사람을 건너 뛰는 고려할 수 : ItemContainerStyle를 사용하여이 작업을 수행합니다. –

+0

hm 귀하의 코드를 사용하고 라인은 스트라이크입니다. 한 행의 탭을 선택/위반했으나 OK이지만 문제는 여전히 userTapped 이벤트가 호출되지 않았습니다. 이미지 또는 텍스트를 탭한 후에 만 ​​userTapped이 호출되지만 빈 공간을 탭하면 아무것도하지 않습니다. –

+1

@PavolFranek 나는 당신이 무슨 뜻인지 안다. 나는 1) ListBox 자체에서 'Tapped'를 사용하거나 2) 대신 ListBox에서 'SelectionChanged' 이벤트를 사용하는 것을 제안한다. – McGarnagle

관련 문제