這篇文章的標題可能會使用一些工作,但我無法表達自己的一些細節。如何用父項和子項實現組合框的層次結構?
所以在這裏。
我有一個簡單的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