【问题标题】:How to get the item selected from ListVIew如何获取从 ListVIew 中选择的项目
【发布时间】:2013-02-01 22:44:33
【问题描述】:

好的,希望你能理解我...

我有一个列表视图。 ListView 填充了一个数据集合(列表列表),但 ListView 中的每个项目都有相同的模板(边框、网格、边框、文本块),所以,当我选择一个文本块时,如何获取文本块的文本属性项目??

xmlns:vmSegments="using:EC_UsuarioWin8.ViewModels"


<Page.Resources>
   <DataTemplate x:Key="ItemTemplateStyleSegment">
        <Border  Margin="-10,0,0,0" Background="White" >
            <Grid Height="120" Width="200">
                <Grid.RowDefinitions>
                    <RowDefinition/>
                    <RowDefinition/>
                </Grid.RowDefinitions>
                <Border Grid.Row="0">
                    <Image Source="{Binding SegmentImage}" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="10"/>
                </Border>
                <Border Grid.Row="1" >
                    <TextBlock Text="{Binding SegmentName}" HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="#FFE0241B" FontSize="20" />
                </Border>
            </Grid>
        </Border>
    </DataTemplate>
</Page.Resources>

<Grid>
   <Grid.Resources>
                <vmSegments:ViewModelSegments x:Key="SegmentCollectionVM" x:Name="SegmentCollectionVM"/>
   </Grid.Resources>

<ListView x:Name="ListVIewSegments" ItemsSource="{Binding Source={StaticResource SegmentCollectionVM}, Path= SegmentList}" Grid.Row="1" Margin="20" ItemContainerStyle="{StaticResource ListViewSItemtyleECFood}" ItemTemplate="{StaticResource ItemTemplateStyleSegment}" SelectionChanged="ListViewSegments_SelectionChanged">
</ListView>

</Grid>

我的班级 ViewModelSegments:

public class ViewModelSegments : BindableBase
{

    private SegmentsCollection _segmentList = new SegmentsCollection();
    public SegmentsCollection SegmentList
    {
        get { return _segmentList; }
        set { SetProperty(ref _segmentList, value); }
    }
}

我的班级 SegmentsCollection:

public class SegmentsCollection: ObservableCollection<Segment>
{

}

我的班级部分:

public class Segment : BindableBase
{
    //Propiedad SegmentName
    private string Name;
    public string SegmentName
    {
        get { return Name; }
        set { SetProperty(ref Name, value); }
    }

    //Propiedad SegmentPicture
    private Uri image;
    public Uri SegmentImage
    {
        get { return image; }
        set { SetProperty(ref image, value); }
    }

}

【问题讨论】:

  • 您是否通过视图模型绑定数据。你能展示一些你的 xaml 吗?
  • 当然!我会编辑帖子。是的,我通过视图模型使用数据

标签: c# xaml windows-8 windows-store-apps windows-store


【解决方案1】:

使用ListViewItemClick事件

//Here sender is your list view
public delegate void ItemClickEventHandler(object sender, ItemClickEventArgs e)
{
   ListView lv = sender as ListView;
   Segment seg = e.ClickedItem as Segment;

   if (lv != null)
   {
      //Use your lv if you want to
   }

   if (seg != null)
   {
      string name = seg. SegmentName;
   }
}

更新

private void ListView_SelectionChanged(object sender,SelectionChangedEventArgs e)
{
    lv.SelectedItem; // If you have set SelectionMode="Single" then it will do
    //the trick but if you set SelectionMode="Multiple" then it's the first
    //selected item

    lv.SelectedItems; // It will give you the selected list of item view models

    e.AddedItems; //This will give you the added items. As it is a list so can
    //be multiple but when it can be multiple I don't know that case.

    e.RemovedItems; //Similarly removed items
}

【讨论】:

  • 是的,它有效,但是,如果我想使用此事件,我已将 IsItemClickEnabled 属性设为“true”,当 tgis 属性为 true 时,我无法在我的 ListView 中选择一个项目跨度>
  • lv.SelectedItem 为空,因此我的列表视图没有被选中
【解决方案2】:

在您的视图模型中创建如下属性:

    public class ViewModelSegments : BindableBase, INotifyPropertyChanged
    {

      private SegmentsCollection _segmentList = new SegmentsCollection();
      public SegmentsCollection SegmentList
      {
        get { return _segmentList; }
        set { SetProperty(ref _segmentList, value); }
      }

      //Bind this property to your ListView SelectedItem property in the xaml

      Segment _selectedSegment;
      public Segment SelectedSegment   
      {
        get
        {
           return _selectedSegment;
        }
        set
        {
           _selectedSegment=value;
           NotifyPropertyChanged("SelectedSegment");
        }
      }

      public event PropertyChangedEventHandler PropertyChanged;

      public void NotifyPropertyChanged(String propertyName)
      {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
      }

   }

在您的 xaml 中将您的 ListView 更改为:

<ListView x:Name="ListVIewSegments" ItemsSource="{Binding Source={StaticResource SegmentCollectionVM}, Path= SegmentList}" Grid.Row="1" Margin="20" ItemContainerStyle="{StaticResource ListViewSItemtyleECFood}" ItemTemplate="{StaticResource ItemTemplateStyleSegment}" SelectedItem="{Binding SelectedSegment}" SelectionChanged="ListViewSegments_SelectionChanged">
</ListView>

现在,每当您的 ListView 选择发生变化时,SelectedSegment 也会随之变化,然后您就可以访问 SelectedSegment.SegmentName

【讨论】:

  • 我们很接近,但没有:(我不太了解你的课。我的 ViewModel 类被称为“ViewModelSegments”,这个类包含一个列表的集合(Segment 类型的列表),在每个列表中,我有我的属性 SegmentName 和 SegmentImage
  • 类型是Segment还是Segments?基本上,您的我假设您的 ViewModelSegments 是这样的: List ViewModelSegments ,对吗?我还假设 Segment 类具有属性 Segment.SegmentName 和 Segment.SegmentImage。话虽如此,我在上面创建的属性应该绑定到 ListView 的 SelectedItem(如 xaml 中所示)。因此,每当用户在列表视图中选择项目时,SelectedSegment 将是当前选定的 Segment,您可以通过 SelectedSegment.SegmentName 检索选定的 SegmentName
  • 是的,叫做 Segment,但是我的 ViewModel 有一个 Collection: private SegmentsCollection _segmentList = new SegmentsCollection();公共 SegmentsCollection SegmentList { get { return _segmentList; } set { SetProperty(ref _segmentList, value); } }
  • 我的另一个类叫做 Segment: private string Name;公共字符串 SegmentName { 获取 { 返回名称; } set { SetProperty(ref Name, value); } } //Propiedad SegmentPicture private Uri image;公共 Uri SegmentImage { 获取 { 返回图像; } set { SetProperty(ref image, value); } }
  • 再看我的帖子,我把我项目的类放了。
【解决方案3】:

这样的?

        string items = "";
        foreach(ListViewItem item in listView1.SelectedItems){
            items += "Item: " + item.Text + "\n";
            foreach (ListViewItem.ListViewSubItem subitem in item.SubItems)
            {
                items += "SubItem: " + subitem.Text + "\n";
            }
        }
        MessageBox.Show(items);

【讨论】:

    【解决方案4】:

    感谢 Inder Kumar Rathore 和 DJ Burb 指导我找到答案。 所以,这里是

    Segment seg= ListView.SelectedItem as Segment;
    if (seg!= null)
    {
        tbckChoiceSelected.Text = compa.CompanyName;//TextBlock called bckChoiceSelected
    }
    

    这很容易。再次,谢谢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 2011-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多