【问题标题】:WPF Binding second ListBox in relation to selected item in first ListBoxWPF绑定第二个ListBox与第一个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 中显示相关更新?

提前致谢!

【问题讨论】:

    标签: c# wpf binding listbox


    【解决方案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 属性的更新集合。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-11
      相关资源
      最近更新 更多