WPF绑定第二个ListBox与第一个ListBox中的选定项目相关

Posted

技术标签:

【中文标题】WPF绑定第二个ListBox与第一个ListBox中的选定项目相关【英文标题】:WPF Binding second ListBox in relation to selected item in first ListBox 【发布时间】:2021-09-21 15:50:53 【问题描述】:

我是 WPF 和 MVVM 的新手……我创建了一个 WorkstationItem 类

public class WorkstationItem

    public WorkstationItem()  

    public string Name  get; set; 
    public string OS  get; set; 
    public List<UpdateItem> Updates  get; set; 

UpdateItem 是另一个类:

public class UpdateItem

    public UpdateItem()  

    public string Title  get; set; 
    public string KB  get; set; 

我创建了一些虚拟数据:

private List<WorkstationItem> workstations = new List<WorkstationItem>();
workstations.Add(new WorkstationItem

    Name = "PC01",
    OS = "Windows Server 2019",
    Updates = new List<UpdateItem>

    new UpdateItem  Title = "Test", KB = "KB123123" ,
    new UpdateItem  Title = "Test2", KB = "KB123123" 
    
);
workstations.Add(new WorkstationItem

    Name = "PC02",
    OS = "Windows Server 2016",
    Updates = new List<UpdateItem>

    new UpdateItem  Title = "Test5", KB = "KB123123" ,
    new UpdateItem  Title = "Test3", KB = "KB123123" 
    
);

现在我在列表框中显示工作站:

<ListBox x:Name="lbPCs" ItemsSource="Binding WorkstationItemList">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Grid >
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="100"/>
                </Grid.ColumnDefinitions>

                <Grid.RowDefinitions>
                    <RowDefinition Height="40"/>
                </Grid.RowDefinitions>

                <StackPanel Grid.Column="0">
                    <TextBlock Text="Binding Name" FontSize="12" FontWeight="Bold" />
                    <TextBlock Text="Binding OS" FontSize="9" />
                </StackPanel>
            </Grid>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

视图模型:

public ObservableCollection<WorkstationItem> WorkstationItemList  get; set; 

WorkstationManager workstationmanager = WorkstationManager.GetInstance();
WorkstationItemList = new ObservableCollection<WorkstationItem>();

foreach (var k in workstationmanager.GetUpdatelist())

    WorkstationItemList.Add(k);

这工作正常...但是我如何在另一个列表中显示与所选工作站相关的List&lt;UpdateItem&gt; Updates

所以我在 list1 中选择了一个工作站,并希望在 list2 中显示相关更新?

提前致谢!

【问题讨论】:

【参考方案1】:

基本上添加另一个 ListBox 或 ItemsControl 引用现有 ListBox 的 SelectedItem 并绑定到 SelectedItem 的Updates 集合;大致类似(未经测试):

<ListBox ItemsSource="Binding ElementName=lbPCs, Path=SelectedItem.Updates">
   <ListBox .ItemTemplate>
      <DataTemplate> 
         <StackPanel Orientation="Horizontal">
            <!-- TODO improve alignment+layout -->
            <TextBlock Text="Binding KB" />
            <TextBlock Text="Binding Title" />
         </StackPanel>
      </DataTemplate>
   <ListBox .ItemTemplate>
</ListBox>

如果您想对所选项目执行更复杂的操作但要显示其Updates,则将 lbPC 的 SelectedItem 绑定到某个新的 ViewModel 属性并将新的 ListBox 的 itemsource 绑定到该属性可能更合适VM 属性的更新集合。

【讨论】:

以上是关于WPF绑定第二个ListBox与第一个ListBox中的选定项目相关的主要内容,如果未能解决你的问题,请参考以下文章

如何将ListBox绑定到返回键以关闭窗口

C#:改变列表框的行颜色?

WPF 数据绑定到第二个视图

WPF中ListBox的绑定

WPF:将 ListBox ContextMenu 的命令参数绑定到 ListBox 的选定项

WPF如何更改xaml代码里ListBox的数据绑定