Mám ožehavý problém a doufám, že vám může pomoci. Jsem vytvořit datagrid, který zahrnuje dynamicky vytváření sloupců. Tady je nějaké pseudokódu pro mé třídy:
GameLibrary
ObservableCollection<Game> Games
Game
ObservableCollection<CustomField> CustomFields
Customfield
ObservableCollection<string> Values
Datagrid je vázán na CollectionViewSource, který používá GameLibrary.Hry, jako jeho Zdroj. Datagrid zobrazí další vlastnosti Hry v každé řadě, jak jsem se nastavit sloupce, a pak mám to dynamicky vytvořen sloupec pro každý CustomField v CustomFields a zobrazí příslušné CustomField Hodnoty v itemscontrol v buňce.
To vše funguje skvěle, žádný problém. Teď, když jsem chtěl seřadit Hodnoty podle abecedy zobrazení. Vím, že nejlepší praxe pro to je použití CollectionViewSource, a mně se podařilo získat jeden set, připojené k DataTemplate a zobrazování v itemscontrol - ale to funguje pouze v případě, jako test, jsem nastavit CVS zdrojový být něco mimo datagrid. To zobrazí, ale samozřejmě to zobrazuje stejnou věc v každém řádku.
Jak mohu svázat DataTemplate je CVS na něco, co v aktuálním řádku tabulky? Je to snadné, když není pomocí CVS, protože můžu použít závazné Cestu a jen říct, "CustomFields[i].Hodnoty", ale já nevím, jak se to překládá přes CVS Zdroj.
Tady je to, co mám teď, který funguje skvěle:
FrameworkElementFactory listbox = new FrameworkElementFactory(typeof(ItemsControl));
Binding b = new Binding();
string pathb = "CustomFields[" + i + "].Values";
b.Path = new PropertyPath(pathb);
b.Mode = BindingMode.TwoWay;
b.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
listbox.SetBinding(ItemsControl.ItemsSourceProperty, b);
listbox.SetValue(ItemsControl.PaddingProperty, new Thickness(5));
dock.AppendChild(listbox);
DataTemplate dt = new DataTemplate { VisualTree = dock };
dt.Seal();
newcolumn.CellTemplate = dt;
gameDataDisplay.Columns.Add(newcolumn);
A tady je to, co chci:
DataTemplate dt = new DataTemplate { VisualTree = dock };
CollectionViewSource listboxCVS = new CollectionViewSource();
SortDescription listboxsortDescription = new SortDescription(".", ListSortDirection.Ascending);
listboxCVS.SortDescriptions.Add(listboxsortDescription);
listboxCVS.Source = SOMETHING HERE BUT I DONT KNOW WHAT;
dt.Resources.Add("customCVS" + i, listboxCVS);
FrameworkElementFactory listbox = new FrameworkElementFactory(typeof(ItemsControl));
Binding b = new Binding();
b.Source = listboxCVS;
listbox.SetBinding(ItemsControl.ItemsSourceProperty, b);
listbox.SetValue(ItemsControl.PaddingProperty, new Thickness(5));
dock.AppendChild(listbox);
dt.Seal();
newcolumn.CellTemplate = dt;
gameDataDisplay.Columns.Add(newcolumn);
Také jsem se snažil místo pomocí CVS vazba na nemovitosti v CustomFields, že se vrátí seřazený seznam Hodnot, a to zobrazuje v pohodě, ale vím, že to není nejlepší praxe, a to nebude aktualizovat, dokud si vyhledejte položku offscreen a zpět, takže si myslím, že je to slepá ulička.
Děkuji vám za jakoukoli pomoc, kterou může nabídnout,
Tom.
PS: ObservableCollections zde nejsou striktně ObservableCollections, jsou odvozené třídě s pár extra metody, ale oni se chovají přesně stejné pro všechny praktické účely. Stačí zde zmínit pro úplnost.