0

我在这里有简单的列表框:链接到我绑定数据的图像。现在,当我点击一个项目(一行)时,列表框项目/行被选中/紫色,但实际上这个项目不是真正选择的,只有行改变颜色,但是当我点击图像或文本时,我点击的行没有被选中/小提琴,但代码中的项目被选中。我不确定你是否明白我在说什么。简而言之,如果我单击空白行,则行是可视选择的,但列表框项之类的发件人不会获取数据,如果我单击文本或图像,则发件人会获取数据,但未选择可视化。当我单击任意行被选中/紫色并且项目发送者获取数据时,我该怎么做?

我的第二个问题是为什么我使用的矩形像线条一样具有最大宽度,我想在列表框的全宽处拉伸这个矩形,这可能吗?

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 但这也不起作用。{

4

1 回答 1

2

请注意,当您使用 an 时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>
于 2013-10-15T18:10:31.167 回答