如何在wpf列表视图中获得选定行的列值

本文关键字:wpf 列表 视图 | 更新日期: 2023-09-27 17:49:31

在我的listview中,我有三列,第一列显示为带有图像的文本,其余列仅显示文本。listview的编码如下:

<TabItem x:Name="HistoryTab" Header="History" Style="{StaticResource TabStyle}">
  <Grid>
    <ListView x:Name="HistoryTabLv" HorizontalAlignment="Left" Height="164" Width="275" VerticalAlignment="Top" SelectionChanged="HistoryTabLv_SelectionChanged" SelectionMode="Single">
      <ListView.View>
        <GridView>
          <GridViewColumn x:Name="TimeColumn" Header="Time" Width="85">
            <GridViewColumn.CellTemplate>
              <DataTemplate>
                <StackPanel Orientation="Horizontal" HorizontalAlignment="Left" Margin="-5,0,0,0">
                  <Image x:Name="Img" Height="12" Width="12" Source="{Binding Image}" Stretch="Uniform"/>
                  <TextBlock Text="{Binding Time}"/>
                </StackPanel>
              </DataTemplate>
            </GridViewColumn.CellTemplate>
          </GridViewColumn>
          <GridViewColumn x:Name="PhoneNumColumn" Header="Phone Number" Width="85" DisplayMemberBinding="{Binding PhoneNum}" />
          <GridViewColumn x:Name="DirectionColumn" Header="Direction" Width="95" DisplayMemberBinding="{Binding Direction}" />
        </GridView>
      </ListView.View>
    </ListView>
  </Grid>
</TabItem>

如果action语句为真,相关数据将被绑定到每一列,如下所示。

private void HistoryTabLv_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    if (myStatement == true)
    {
         var uri = new Uri(@"/Resources/time.png", UriKind.Relative);
         myImg = new BitmapImage(uri);
         DateTime myTime = DateTime.Now;
         HistoryTabLv.Items.Insert(0, new { Image = myImg, Time = myTime.ToString("hh:mm:ss tt"), PhoneNum = calledNum,
                    Direction = "Called out" }); 
    }
}

在winform中,如果我想获得所选行的第二列值,它是这样编码的:(基于我搜索的内容)

string secondCol = lv.SelectedItems[0].SubItems[1].Text;

我想获得所选行的第二列值(在我的情况下是PhoneNum列),我如何在WPF中做到这一点。我尝试了下面的代码,但它不起作用。请帮助。

string myText = (string)((DataRowView)HistoryTabLv.SelectedItems[0])["PhoneNum"];

如何在wpf列表视图中获得选定行的列值

在WPF中,ListViewItem只是您的内容对象的包装器,SelectedItem(s)将与源集合中的项目具有相同的类型,因此通常您会将HistoryTabLv.SelectedItem转换为该类型,但是因为,据我所知,您使用匿名类型会使其变得更加困难。我认为最简单的方法是围绕你的问题是使用dynamic

dynamic selectedItem = HistoryTabLv.SelectedItem;
var phoneNum = selectedItem.PhoneNum;

dynamic selectedItem = HistoryTabLv.SelectedItems[0];
var phoneNum = selectedItem.PhoneNum;

编辑

如果您要为您的项目创建类,如

public class MyItemClass {
    public string Image  { get; set; }
    public string Time { get; set; }
    public string PhoneNum { get; set; }
    public string Direction { get; set; }
}

和创建您的项目,如

new MyItemClass { 
    Image = myImg, 
    Time = myTime.ToString("hh:mm:ss tt"), 
    PhoneNum = calledNum,
    Direction = "Called out" 
}

那么你可以将SelectedItem(s)强制转换为你的项目类,如

var selectedItem = (MyItemType)HistoryTabLv.SelectedItem