请参阅下面的代码,我想在roomBlock集合中添加数据,以便对于Hotelnm中的每个唯一名称,它包含该特定酒店名称的所有记录。因此,如果我的UI首先将酒店名称显示为ABC,则相应的roomBlock将具有来自result.ResultSet的所有记录,其中包含该名称。我该怎么做?
Hotelnm是一个包含酒店唯一名称的哈希集。现在我想为hashset中的每个名称显示该特定酒店的一组数据。例如,我的result.ResultSet包含多次酒店名称的记录。所以我想显示一次该酒店名称,然后显示该酒店名称的所有记录。我上面加粗的代码并没有显示特定酒店的所有记录,它只显示一次。
答案 0 :(得分:1)
foreach (DomainObject obj in result.ResultSet)
{
RoomBlock rmblk = (RoomBlock)obj;
if (!Hotelnm.Contains(rmblk.HotelName))
{
Hotelnm.Add(rmblk.HotelName);
**//roomBlock.Add(new RoomBlockViewModel(rmblk));**
}
}
如果你的记录在result.ResultSet中,那么你的代码保证每个酒店最多只能看到一条记录。
这是因为您在if (!Hotelnm.Contains(rmblk.HotelName))
之前写了Hotelnm.Add(rmblk.HotelName)
。在foreach循环中的每个后续记录中,您保证不会为同一酒店添加任何rmblk。
答案 1 :(得分:1)
您正在谈论主/细节关系(控件之间),而您的代码并没有这样做。您已创建酒店名称的“主列表”,但您尚未捕获任何数据结构中的每个酒店的详细信息(我可以在您的示例中看到)。
您需要收集酒店的唯一名称(可能是唯一的ID),然后创建一个后续数据结构,其中包含所有酒店的详细信息,然后将主控制器连接到详细控件,以便在您更改时主控件的索引(例如ComboBox),详细控件(例如数据网格)显示该酒店名称的所有详细信息。
// link query to get you a list of distinct hotel names
var hotelNames = result.ResultSet.Select(rb => rb.HotelName).Distinct().ToList();
现在您有一个不同的酒店名称列表,您需要将该集合绑定到控件。当该控件SelectedIndex
发生更改时,您需要更新另一个详细记录集合的内容,这些记录集合在不同的集合中并绑定到数据网格或某些表格表示。
// list of details passed on a hotelname
// the where clause has a variable that represents the hotel name from the SelectedIndex
// in the master list
var hotelDetails = results.ResultSet.Where(rb.HotelName == hotelNameVariable);
我认为这是解决问题的开始。你真的需要退后一步,尝试去理解你想要做的事情,然后把它分解成你可以慢慢建立的小步骤。
或者我可能完全偏离轨道。 :)我已经猜到了你的问题的意图以及你想要做的事情。
答案 2 :(得分:1)
您需要做的第一件事就是创建一个SortedDictionary<string, RoomBlockViewModel>
,其关键是酒店名称。这可以很容易地完成:
Dictionary<string, List<RoomBlockViewModel>> hotelRooms = result.resultSet
.Cast<RoomBlock>()
.Select(x => new RoomBlockViewModel(x))
.GroupBy(x => x.HotelName)
.ToDictionary(x => x.Key, x => x.ToList());
Hotels.DataContext = new SortedDictionary<string, List<RoomBlockViewModel>>(hotelRooms);
这假定RoomBlockViewModel
公开HotelName
属性,以便您可以按其分组,并且酒店名称是唯一的。此代码中的Hotels
是包含酒店的ListBox
。
当你绑定到WPF中的字典时,你真的绑定到IEnumerable<KeyValuePair<TKey, TValue>>
- 也就是说,数据源中的每个对象都有Key
和Value
属性,在这种情况下,其类型为string
和List<RoomBlockViewModel>
。
因此酒店列表将此词典作为其数据上下文,并使用ItemTemplate
来显示Key
(即酒店名称)。空间列表的ItemsSource
与SelectedItem.Value
列表框中的Hotels
绑定,因为Value
包含List<RoomBlockViewModel>
。
<DockPanel>
<ListBox x:Name="Hotels"
Margin="5"
Background="Lavender"
DockPanel.Dock="Top"
ItemsSource="{Binding}">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=Key}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<ListBox Margin="5"
Background="AliceBlue"
ItemsSource="{Binding ElementName=Hotels, Path=SelectedItem.Value}">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Info}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</DockPanel>
答案 3 :(得分:0)
您突出显示的代码不应位于条件内。这不是唯一的数据。它需要在条件之外。
foreach (DomainObject obj in result.ResultSet)
{
RoomBlock rmblk = (RoomBlock)obj;
if (!Hotelnm.Contains(rmblk.HotelName))
{
Hotelnm.Add(rmblk.HotelName);
}
roomBlock.Add(new RoomBlockViewModel(rmblk));
}
MainListBox.DataContext = Hotelnm;
编辑:我的假设是你有一个名为roomBlock
的变量用于保存这些信息,并且它与Hotelnm相关联。如果您想以某种方式将其添加到Hotelnm,您需要提供一些连接。