获取可绑定集合中项目的索引

Posted

技术标签:

【中文标题】获取可绑定集合中项目的索引【英文标题】:Get index of item in bindable collection 【发布时间】:2014-10-27 14:57:55 【问题描述】:

在此列表框中,我显示联系人姓名。

<ListBox x:Name="Items" Margin="36,38,78,131">
    <ListBox.ItemTemplate>
        <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <TextBlock x:Name="lol" Text="Binding Path=ContactName" Style="StaticResource PhoneTextSmallStyle"
Width="Auto" TextAlignment="Center" FontWeight="Bold" Foreground="White" VerticalAlignment="Bottom" TextWrapping="Wrap"/>
                    <Button x:Name="ShowName">
                        <i:Interaction.Triggers>
                            <i:EventTrigger EventName="Click">
                                <cal:ActionMessage MethodName="delete" />
                            </i:EventTrigger>
                        </i:Interaction.Triggers>
                    </Button>
                </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

我从本地数据库获取联系人

public List<FBContacts> listContactDatas  get; set; 

Items = new BindableCollection<FBContacts>();= new BindableCollection<FBContacts>();

public void GetContacts()
    
       using(MyDataContext mydb = new MyDataContext(DBConnectionstring))
        
        var items = from ContactsList Name in mydb._contacts select Name;
        foreach (var toDoItem in items)
        
           Items.Add(new FBContacts()
                
                    ContactName = toDoItem.Name
                );
        
        
    

用户可以删除任何联系人,如果他按下按钮。

public void delete()
    
        Items.RemoveAt(/* index*/);
    

那么我怎样才能获得所选联系人的索引?

【问题讨论】:

【参考方案1】:

如果将点击的FBContacts 传递给delete 方法会更容易:

<Button x:Name="ShowName">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="Click">
            <cal:ActionMessage MethodName="delete">
                <cal:Parameter Value="Binding" />
            </cal:ActionMessage>
        </i:EventTrigger>
    </i:Interaction.Triggers>
</Button>

然后您可以通过FBContacts 对象而不是索引来删除:

public void delete(FBContacts item)

    Items.Remove(item);

【讨论】:

【参考方案2】:

将当前选中项的索引绑定到一个单独的属性:

<ListBox x:Name="Items" SelectedIndex="Binding SelectedListIndex" Margin="36,38,78,131">

当然,SelectedListIndex 必须定义为在 Viewmodel 中触发 PropertyChangedint 类型的属性。

然后,您可以在 Viewmodel 中的任何位置轻松访问所选项目的索引:

public void delete()

    Items.RemoveAt(SelectedListIndex);

【讨论】:

SelectedListIndex 属性是否在更改选择时更新(例如,设置器上的断点)?可能需要加SelectedIndex="Binding SelectedListIndex, Mode=TwoWay"来强制更新属性 我在 System.Windows.ni.dll 中收到此错误 System.Reflection.TargetInvocationException" 可能在创建SelectedListIndex 之前更改了列表的选择。你如何填充列表?列表项是否通过数据绑定设置?

以上是关于获取可绑定集合中项目的索引的主要内容,如果未能解决你的问题,请参考以下文章

使用 LINQ 排序后获取集合中项目的新索引

如何将 TabControl 的项目绑定到 wpf 中的可观察集合?

通过索引 Laravel 5 从集合中获取项目

获取 ListBoxItem 的索引 - WPF

如何用绑定集合的索引填充组合框?

使用 HTML 助手时不正确的列表模型绑定索引