这篇文章的标题可能会使用一些工作,但我无法表达自己的一些细节。如何用父项和子项实现组合框的层次结构?
所以在这里。
我有一个简单的WPF应用程序,它从第三方API检索State
,City
,Complex
和Building
的列表。
public class State
{
public int Id { get; set; }
public string Name { get; set; }
}
public class City
{
public int Id { get; set; }
public int ParentId { get; set; } // FK to Id in State
public string Name { get; set; }
}
public class Complex
{
public int Id { get; set; }
public int ParentId { get; set; } // FK to Id in City
public string Name { get; set; }
}
public class Building
{
public int Id { get; set; }
public int ParentId { get; set; } // FK to Id in Complex
public string Name { get; set; }
}
当填充一些数据时,这些列表可能看起来像这样;
StateOptions = new ObservableCollection<State>
{
new State() { Id = 1, Name = "California"},
new State() { Id = 2, Name = "New York"},
};
CityOptions = new ObservableCollection<City>
{
new City() { Id = 1, ParentId = 1, Name = "Los Angeles"},
new City() { Id = 2, ParentId = 2, Name = "New York City"}
};
ComplexOptions = new ObservableCollection<Complex>
{
new Complex() { Id = 1, ParentId = 1, Name = "Los Angeles International Airport"},
new Complex() { Id = 2, ParentId = 2, Name = "John F. Kennedy International Airport"}
};
BuildingOptions = new ObservableCollection<Building>
{
new Building() { Id = 1, ParentId = 1, Name = "Terminal 1"},
new Building() { Id = 2, ParentId = 1, Name = "Terminal 2"},
new Building() { Id = 3, ParentId = 1, Name = "Terminal 3"},
new Building() { Id = 4, ParentId = 2, Name = "Terminal 1"},
new Building() { Id = 5, ParentId = 2, Name = "Terminal 2"},
new Building() { Id = 6, ParentId = 2, Name = "Terminal 3"},
};
使用这些列表,我需要创建一个新的对象,Foo
,然后回发到API。
public class Foo
{
public int Id { get; set; }
public int StateId { get; set;
public int CityId { get; set;
public int ComplexId { get; set;
public int BuildingId { get; set;
}
这本身就是很简单,因为你可以只是把名单四个观察集合,并使用它们作为ItemSource
四个ComboBox
元素结合。然后,您可以使用SelectedItem
绑定属性为每个这些组合框创建Foo
对象。
这将是整洁,如果这些是扁平列表,但请注意City
,Complex
和Building
模型中的ParentId
字段。
这样的四个列表必须处理的层次。实际上,ParentId
这个名称很具误导性,因为它们没有引用另一个相同类型的实体。当看到Foo
类时,这变得很明显,它们具有上述所有的外键。
因此,我需要筛选City
组合框的项目,以仅显示Id等于State
组合框的SelectedItem的ParentId的项目。 Complex
和Building
组合框也是这种情况。
为了进一步增加这一点,我宁愿通过创建一个WPF用户控件,因为这四个名单将在未来的许多观点再次出现,并要求相同的功能解决了这个问题。然而我对所有的解决方案都很开放。我还希望在不进行额外访问的情况下执行此操作,因为列表非常大。
为了您的方便,我在https://db.tt/IAyOiq35创造了一个示范项目。该项目通过将这四个列表视为单位来说明问题所在,因此尽管纽约州被选为国家,您仍然可以选择洛杉矶国际机场作为综合体。这显然是错误的,这正是我想阻止用户做错的那种错误。
如果还有其他问题,请留下评论。
当您在一个列表中选择一个项目时,您无法过滤其他列表(例如,基于parentId创建一个子集)? – scheien
我非常确定这样做可以正常工作,但正如我所看到的那样会将大部分逻辑推入视图模型。试图避免这种情况,因为这种完全相同的逻辑将被复制到许多未来的视图模型中,并且我喜欢避免复制代码。 –
构建分层数据模型。 – Sheridan