帮助C#逻辑

时间:2010-10-27 15:40:49

标签: c# wpf

请参阅下面的代码,我想在roomBlock集合中添加数据,以便对于Hotelnm中的每个唯一名称,它包含该特定酒店名称的所有记录。因此,如果我的UI首先将酒店名称显示为ABC,则相应的roomBlock将具有来自result.ResultSet的所有记录,其中包含该名称。我该怎么做?

Hotelnm是一个包含酒店唯一名称的哈希集。现在我想为hashset中的每个名称显示该特定酒店的一组数据。例如,我的result.ResultSet包含多次酒店名称的记录。所以我想显示一次该酒店名称,然后显示该酒店名称的所有记录。我上面加粗的代码并没有显示特定酒店的所有记录,它只显示一次。

4 个答案:

答案 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>> - 也就是说,数据源中的每个对象都有KeyValue属性,在这种情况下,其类型为stringList<RoomBlockViewModel>

因此酒店列表将此词典作为其数据上下文,并使用ItemTemplate来显示Key(即酒店名称)。空间列表的ItemsSourceSelectedItem.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,您需要提供一些连接。