2013-10-15 87 views
0

我在這裏有簡單的列表框:link to image在那裏我有綁定數據。現在當我點擊一個項目(一行)列表框項目/行被選中/紫色,但實際上這個項目是不是真正選擇只有行改變顏色,但當我點擊圖像或文字,然後行我在哪裏點擊未選中/小提琴,但選擇了代碼中的項目。我不確定你是否明白我在說什麼。簡而言之,如果我點擊空白行然後行是可視化選擇,但發件人像列表框項目不獲取數據,如果我點擊文本或圖像,然後發件人獲取數據,但它不是可視化選擇。當我點擊任何地方行被選中/紫羅蘭和項目發件人獲取數據時,我怎麼能做到這一點?結合,來選擇項目列表框在用的DataTemplate

我的第二個問題是,爲什麼像使用我行矩形的最大寬度如文本我想在列表框中的全寬這是可能的STRETCH時這個矩形?

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的,因爲這將產生兩個嵌套的。嘗試刪除它,就像這樣:

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

對於處理程序,它可能更容易被其他的名字簡單地引用,而不是試圖用Tag(感謝@MetroSmurf)列表框:

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

對於問題的第二部分:要拉伸物品,您需要拉伸ListBoxItem包裝。通過使用ItemContainerStyle做到這一點:

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

可能要考慮跳過'發件人爲StackPanel'檢查和剛剛接觸'lbMessagesUsersList.SelectedItem'。 –

+0

hm我使用你的代碼和線是strech那好的,當點擊一行被選中/ violed確定,但問題是事件userTapped仍然沒有被調用。只有當我點擊圖片或文字時,纔會調用userTapped,但是當點擊空白處時,則什麼也不做。 –

+1

@PavolFranek我明白你的意思了。我建議1)使用列表框本身的'Tapped',或者2)使用ListBox上的'SelectionChanged'事件代替 – McGarnagle