将列表框中的选定项目与datatemplate绑定

时间:2013-10-15 17:57:16

标签: c# xaml windows-8 listbox windows-store-apps

我这里有简单的列表框: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,但这也不起作用。{

1 个答案:

答案 0 :(得分:2)

请注意,当您使用ItemTemplate时,每个项目都会包含在ListBoxItem中 - 因此,您不应该在模板中使用ListBoxItem,因为这将生成两个嵌套那些。尝试删除它,如下所示:

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

对于处理程序,可能更容易按名称简单引用ListBox而不是尝试使用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>