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

WPF Binding second ListBox in relation to selected item in first ListBox

我是 WPF 和 MVVM 的新手...我创建了一个 class WorkstationItem

public class WorkstationItem
{
    public WorkstationItem() { }

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

UpdateItem 是另一个 class:

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);
}

工作正常...但是我如何在与 selected 工作站相关的另一个列表中显示 List<UpdateItem> Updates

所以我 select 列表 1 中的一个工作站并想显示列表 2 中的相关更新?

提前致谢!

基本上添加另一个引用现有ListBox的SelectedItem的ListBox或ItemsControl,并绑定到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 项目源绑定到该 VM 属性 的更新集合。