【问题标题】:Binding selected item in listbox with datatemplate使用数据模板绑定列表框中的选定项目
【发布时间】:2013-10-15 17:57:16
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    请注意,当您使用 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>
    

    【讨论】:

    • 可能要考虑跳过sender as StackPanel检查,直接访问lbMessagesUsersList.SelectedItem。
    • hm 我使用您的代码并且行是 strech 没关系,当点击一行时选择/违反 OK 但问题是事件 userTapped 仍然没有被调用。只有当我点击图像或文本时才会调用 userTapped 但是当点击空白时什么也不做。
    • @PavolFranek 我明白你的意思。我建议 1) 在 ListBox 本身上使用 Tapped,或者 2) 在 ListBox 上使用 SelectionChanged 事件
    猜你喜欢
    • 1970-01-01
    • 2013-02-23
    • 1970-01-01
    • 2015-04-04
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    相关资源
    最近更新 更多