【问题标题】:Issues with items in listview having the same text/content列表视图中具有相同文本/内容的项目的问题
【发布时间】:2012-12-14 20:36:36
【问题描述】:

我将列表视图绑定到字符串的 ObservableCollection。

Xaml:

<ListView Margin="4" Name="LvRiserList" DockPanel.Dock="Top" ItemsSource="{Binding GetAllRiserTags, UpdateSourceTrigger=PropertyChanged}">
    <ListView.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding}" HorizontalAlignment="Stretch" />
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

代码:

public ObservableCollection<string> GetAllRiserTags
{
    get
    {
        var riserTags = new ObservableCollection<string>();
        foreach (var riser in RiserCollection)
        {
            riserTags.Add(riser.Tag);
        }
        return riserTags;
    }
}

当一个按钮被点击时,列表会被一个一个地填充,并且每个标签被赋予一个默认值“空”。

列表将按预期填充列表,但是当我尝试选择其中一项时出现问题;只有第一个被选中。如果我给标签不同的(唯一的)默认名称,它们会按预期被选中。

知道它为什么会这样吗?

【问题讨论】:

  • 包含您用来“选择”项目的代码。
  • 你在点击选择吗?如果是这样,请确认您单击的是 TextBlock 本身,而不是 ListViewItem 的空白部分;因为使用 TextBlock 作为 ListView ItemTemplate 将导致项目仅跨越它的内容长度。
  • 我尝试用鼠标选择它们。如果我点击第三个项目,第一个项目将被标记为蓝色。
  • 使用 Label 或 TextBlock 的结果是一样的。

标签: c# listview observablecollection


【解决方案1】:

删除 ListView.ItemTemplate 并尝试一下。

<ListView Margin="4" Name="LvRiserList" DockPanel.Dock="Top" ItemsSource="{Binding GetAllRiserTags, UpdateSourceTrigger=PropertyChanged}">
</ListView>

【讨论】:

  • 它给出了相同的结果。 itemtemplate 是不必要的,但删除它并没有解决我的问题:/
【解决方案2】:

创建一个包含 id 和 value 属性的自定义类。覆盖 GetHash 和 Equals 函数。 在您的 Viewmodel 中计算 id 或给它一些唯一值。

绑定到 value 属性。

如果你不使用自定义类,你总是会遇到这个问题:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-28
    • 2013-04-06
    • 2018-12-25
    相关资源
    最近更新 更多