在另一个列表框项目模板内的列表框中未获取所选项目

本文关键字:项目 列表 获取 选项 另一个 | 更新日期: 2023-09-27 17:58:04

我有一个PrimaryItems列表&每个PrimaryItem都有一个SecondaryItems列表。所以我用一个ListBox作为另一个ListBoxItempTemplate

<ListBox ItemsSource="{Binding PrimaryItems}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel>
                    <TextBlock Text="{Binding Name}"/>
                    <ListBox ItemsSource="{Binding SecondaryItems}" SelectedItem="{Binding SelectedSecondaryItem}" ScrollViewer.VerticalScrollBarVisibility="Disabled" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
                        <ListBox.ItemTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding Name}"/>
                            </DataTemplate>
                        </ListBox.ItemTemplate>
                    </ListBox>
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>


我的视图模型代码

    private List<PrimaryItem> _primaryItems;
    public List<PrimaryItem> PrimaryItems
    {
        get { return _primaryItems; }
        set { _primaryItems = value;RaisePropertyChanged(); }
    }
    //SecondaryItems list is inside in each PrimaryItem
    //private List<SecondaryItem> _secondaryItems;
    //public List<SecondaryItem> SecondaryItems
    //{
       // get { return _secondaryItems; }
       // set { _secondaryItems = value; RaisePropertyChanged(); }
    //}
    private SecondaryItem _selectedSecondaryItem;
    public SecondaryItem SelectedSecondaryItem
    {
        get { return _selectedSecondaryItem; }
        set 
        {
            _selectedSecondaryItem = value;
            if (_selectedSecondaryItem != null)
            {
                //TO DO
            }
        }
    }<br/>

这是class结构

public class PrimaryItem
{
  public int Id { get; set; }
  public string Name { get; set; }
  public List<SecondaryItem> SecondaryItems{ get; set; }
}
public class SecondaryItem
{
  public int Id { get; set; }
  public string Name { get; set; }  
}

并且我将CCD_ 7绑定设置为CCD_
但我没有在Second ListBox上获得选择触发器
我们可以在另一个ListBox`Template中使用ListBox
如果是,我们如何克服这个问题?

在另一个列表框项目模板内的列表框中未获取所选项目

首先,使用ObservableCollection而不是List,因为它实现了INotifyPropertyChanged接口。

据我所知,PrimaryItem类应该有一个属性SecondaryItems。因此,将其从ViewModel中删除并粘贴到PrimaryItem类(以及SelectedSecondaryItem属性):

private ObservableCollection<SecondaryItem> _secondaryItems;
public ObservableCollection<SecondaryItem> SecondaryItems
{
    get { return _secondaryItems; }
    set { _secondaryItems = value; RaisePropertyChanged(); }
}

编辑:

我已经完全再现了你的情况并使其发挥作用。

类别:

public class PrimaryItem
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<SecondaryItem> SecondaryItems { get; set; }
    private SecondaryItem _selectedSecondaryItem;
    public SecondaryItem SelectedSecondaryItem
    {
        get { return _selectedSecondaryItem; }
        set
        {
            _selectedSecondaryItem = value;
            if (_selectedSecondaryItem != null)
            { // My breakpoint here
                //TO DO
            }
        }
    }
}
public class SecondaryItem
{
    public int Id { get; set; }
    public string Name { get; set; }
}

视图模型:

public class MyViewModel : ViewModelBase
{
    private List<PrimaryItem> _primaryItems;
    public List<PrimaryItem> PrimaryItems
    {
        get { return _primaryItems; }
        set { _primaryItems = value; RaisePropertyChanged("PrimaryItems"); }
    }
    public ErrorMessageViewModel()
    {
        this.PrimaryItems = new List<PrimaryItem>
            {
                new PrimaryItem
                    {
                        SecondaryItems =
                            new List<SecondaryItem>
                                {
                                    new SecondaryItem { Id = 1, Name = "First" },
                                    new SecondaryItem { Id = 2, Name = "Second" },
                                    new SecondaryItem { Id = 3, Name = "Third" }
                                },
                        Name = "FirstPrimary",
                        Id = 1
                    }
            };
    }
}

视图:

<Window x:Class="TestApp.Views.MyView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:vm="clr-namespace:TestApp.ViewModels;assembly=TestApp.ViewModels"
    xmlns:my="http://schemas.microsoft.com/wpf/2008/toolkit"
    Title="Title" Height="240" Width="270" ResizeMode="NoResize"
    WindowStartupLocation="CenterOwner" WindowStyle="ToolWindow">
<Window.DataContext>
    <vm:MyViewModel/>
</Window.DataContext>
<Grid>
    <ListBox ItemsSource="{Binding PrimaryItems}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel>
                    <TextBlock Text="{Binding Name}"/>
                    <ListBox ItemsSource="{Binding SecondaryItems}" SelectedItem="{Binding SelectedSecondaryItem}" ScrollViewer.VerticalScrollBarVisibility="Disabled" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
                        <ListBox.ItemTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding Name}"/>
                            </DataTemplate>
                        </ListBox.ItemTemplate>
                    </ListBox>
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Grid>
</Window>

您可以尝试使用LinqToVisualTree,它可以在您的应用程序中获得几乎所有的Control,您只需要选择要查找的内容(在您的情况下为ListBoxItem),然后将其转换为您的模型。当我需要从ListboxItem中的TextBox获取文本时,我使用了它。但它也适合你的任务。