如何在WPF中获取ListViewItem的索引值?

时间:2014-08-20 21:03:13

标签: c# wpf xaml

我正在制作CRUD地址簿以熟悉WPF应用程序。

我有三个类:AllContacts,User和SingleContact。 AllContacts使用ObservableCollection将所有现有联系人保存为用户对象。 SingleContact仅用于在新窗口中显示信息(我实际上不太确定这是否有必要,您对此有何看法)?

我将在下面解释更多:

我使用ListView显示Window_1中的所有联系人(XAML:AllContacts),如下所示:

<ListView Name="lbUsers" DisplayMemberPath="Name" 
          ItemContainerStyle="{StaticResource ListView}" 
          AlternationCount="2" DockPanel.Dock="Bottom" 
          BorderThickness="0" Margin="0,4">                
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" 
                            Width="150"></GridViewColumn>
            <GridViewColumn Header="Phone Number" 
                            DisplayMemberBinding="{Binding PhoneNumber}" 
                            Width="150"></GridViewColumn>
            <GridViewColumn Header="Favorite" 
                            DisplayMemberBinding="{Binding FavoriteStr}" 
                            Width="95"></GridViewColumn>
        </GridView>
    </ListView.View>
</ListView>

然后,我希望实现一项功能,当我双击某个联系人时,它会打开Window_2(类:SingleContact)以显示所有选定联系人的信息。

以下方法在AllContacts中定义:

private void ListViewItem_MouseDoubleClick(object sender, RoutedEventArgs e)
{
    SingleContact contactIndex = new SingleContact( [I WANT TO PASS IN USER OBJECT HERE ] );
    contactIndex.Owner = this;

    if (contactIndex.ShowDialog() != true)
    {
        return;
    }
}

但是,当我在代码中创建新的SingleContact对象时,我不确定如何获得在Window_1(XAML:AllContacts)中单击的联系人的值并将User Object值传递给Window_2(class:SingleContact)上方。

我如何优雅地实现这一目标?

提前致谢!

2 个答案:

答案 0 :(得分:0)

这是我过去写过的类似应用程序。基本上,您正在调用一个命令(我正在使用MVVM-Light),并将选定的练习作为参数传递。

<ListBox x:Name="LastExercises_ListView"  
                  ItemsSource="{Binding FilteredCollection}"
                  SelectedItem="{Binding SelectedExercise, UpdateSourceTrigger=PropertyChanged}"
                  ToolTip="Double click to edit"
                  >
            <ListBox.ContextMenu>
                <ContextMenu>
                    <MenuItem Header ="Edit Exercise"   
                              Command="{Binding EditExercise_Command}" 
                              CommandParameter="{Binding SelectedExercise}"
                    />
                    <MenuItem Header ="Delete Exercise" 
                              Command="{Binding DeleteExercise_Command}" 
                               CommandParameter="{Binding SelectedExercise}"
                    />
                </ContextMenu>
            </ListBox.ContextMenu>

如果您没有使用框架,则可能需要实现类似Command的内容。 这是我为我定义的地方:

 xmlns:Command="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras.WPF45"

答案 1 :(得分:0)

首先,您需要更改将显示联系人的构造函数或窗口,以便它可以显示内容,或者您​​可以添加另一个。

然后在初始化窗口时,您需要传递listView的选定项目,如下所示:

private void ListViewItem_MouseDoubleClick(object sender, RoutedEventArgs e)
{
     SingleContact contactIndex = new SingleContact((User)this.lbUsers.SelectedItem);
     //if SingleContact is the window
     contactIndex.Show();
}

解释:

(User)this.lbUsers.SelectedItem;

用户将所选项目强制转换为您的类对象,现在在window2中,您可以根据需要显示所选项目当前窗口,lbUsers.SelectedItem是访问列表视图中所选项目的代码

希望这有帮助。