WPF列表框:选择问题

3
在我的XAML文件中,我声明了一个ListBox,如下所示:
           <ListBox x:Name="lstDeck" Height="280" ItemsSource="{Binding Path=Deck}"  >
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <ListBoxItem  Content="{Binding}" />
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>

在我的视图模型中,Deck 是一个 ObservableCollection,所以绑定直接显示了我的集合的内容。
但是当我有几个值持有相同的值(例如“10”重复六次),ListBox 中的选择行为非常奇怪:它选择了 2-3 个元素,而不是只有我单击的那一个。
此外,当我单击另一个 listBoxItem 时,它并不取消前一个已选中的项。
因此,无法看到实际选定的项目,并且无法获取 SelectedIndex 值。
是否有人有什么想法?
1个回答

8
问题在于列表框无法区分不同的值。因此,一旦您单击其中一个“10”,它就会设置其SelectedItem属性并更新其显示方式。由于无法区分值类型,它将每个“10”标记为已选。
但是,为什么您的列表框中有多个“10”?如果它只是数值10或字符串“10”,那对我来说没有任何意义。
如果您在列表框后面有一个更复杂的模型,并且只显示一个属性,则应绑定该复杂模型并设置DisplayMemberPath。
C#
public class Model
{
    public Guid Id { get; set; }
    public string Value { get; set; }
}

XAML

<ListBox ItemsSource="{Binding Path=Models}" DisplayMemberPath="Value" />

<ListBox ItemsSource="{Binding Path=Models}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Path=Value}" />
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

最好的问候
Oliver Hanappi


它显示数字10,但那只是一个例子。实际上,我有一个列表框,显示一组游戏卡片,另一个列表框则显示添加到牌组中的这些卡片的ID。由于可能会有3-4张相同的卡片,因此可能会有多个相同的值。这就是我的问题所在。 - KiTe
2
我看到了你的问题。将你的卡片结构体转换成一个类。这样,用户会看到两张相同的卡片,但在内部它们并不相同(引用相等性与值相等性)。确保你不要以实现值相等性的方式覆盖Equals和GetHashCode方法。 - Oliver Hanappi
Oliver是正确的。您的列表框使用数字“10”作为对象的键。由于您有多个“10”,因此所有这些都被选中。您需要有一些区分它们的东西,因此他建议上面的对象。 - Darien Ford
1
我知道这是一个非常老的问题,但我只是好奇你的答案是什么,如何将模型绑定到另一个ListBox,并将displaymemberPath设置为Value会有什么帮助?可能有些显而易见的东西我现在无法理解...谢谢。 - Moulde

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接