Wpf document list listiteméhez lista hozzáadása

Wpf document list listiteméhez lista hozzáadása
2012-03-01T12:15:25+01:00
2012-03-06T11:21:29+01:00
2022-11-24T22:45:37+01:00
Buci88
Sziasztok,

baromi egyszerű dologról van szó:

dinamikusan szeretnék felépíteni egy listát, de nem jövök rá(google sem mondta meg), hogy hogyan tudok egy lista listiteméhez hozzáadni egy listát (szóval többszintű lesz). A konstruktora csak paragraph-ot kaphat, de érdekes mondom xaml-be manuálisan simán engedni beágyazni. Ez most miért is van? És mi a megoldás?

Köszönöm!
Mutasd a teljes hozzászólást!
Ime egy megoldás, ami egy fa. A WPF TreeView komponense ezt tudja megenni, kettős RootItem kell neki, ha vizuálisan is akarsz RootItem-et megjeleníteni, mert a legfelső szintű az ItemSource-nak kell, s az ebben lévőt fogja megjeleníteni csak Root-ként:

public class ViewModelBase : INotifyPropertyChanged { #region INotifyPropertyChanged Members public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName) { if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } #endregion } public class ListItem : ViewModelBase { private int m_Id; public int Id { get { return m_Id; } set { m_Id = value; OnPropertyChanged("Id"); } } private string m_Name; public string Name { get { return m_Name; } set { m_Name = value; OnPropertyChanged("Name"); } } public override string ToString() { return Name; } private ObservableCollection<ListItem> m_Children = new ObservableCollection<ListItem>(); public ObservableCollection<ListItem> Children { get { return m_Children; } } } public class MainViewModel : ViewModelBase { private ListItem m_RootItem; public ListItem RootItem { get { return m_RootItem; } private set { m_RootItem = value; OnPropertyChanged("RootItem"); } } public MainViewModel() { ReLoad(); } public void ReLoad() { int id = 0; m_RootItem = new ListItem { Id = id, Name = "TreeViewRoot" }; id++; ListItem m_root = new ListItem { Id = id, Name = "Root" }; m_RootItem.Children.Add(m_root); id++; for (int i = 0; i < 2; i++) { ListItem tmp_i = new ListItem { Id = id, Name = "Level=1, Order=" + i.ToString() }; id++; m_root.Children.Add(tmp_i); for (int j = 0; j < 10; j++) { ListItem tmp_j = new ListItem { Id = id, Name = "Level=2, Order=" + j.ToString() }; id++; tmp_i.Children.Add(tmp_j); for (int k = 0; k < 10; k++) { ListItem tmp_k = new ListItem { Id = id, Name = "Level=3, Order=" + k.ToString() }; id++; tmp_j.Children.Add(tmp_k); } } } OnPropertyChanged("RootSignals"); } }
Mutasd a teljes hozzászólást!

  • Szerintem ezt nem tudod kódból megoldani jelenleg.

    List Class

    Ha megnézed az MSDN List példáit, a legutolsó példa pont az amit szeretnél, de kódot ennél a példánál ők sem adtak :)

    Esetleg táblázattal megoldhatod a több szintű listát, felveszel egy táblázatot majd a soraiba rögzíted a listáid.
    Mutasd a teljes hozzászólást!
  • Mutasd a teljes hozzászólást!
  • Ime egy megoldás, ami egy fa. A WPF TreeView komponense ezt tudja megenni, kettős RootItem kell neki, ha vizuálisan is akarsz RootItem-et megjeleníteni, mert a legfelső szintű az ItemSource-nak kell, s az ebben lévőt fogja megjeleníteni csak Root-ként:

    public class ViewModelBase : INotifyPropertyChanged { #region INotifyPropertyChanged Members public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName) { if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } #endregion } public class ListItem : ViewModelBase { private int m_Id; public int Id { get { return m_Id; } set { m_Id = value; OnPropertyChanged("Id"); } } private string m_Name; public string Name { get { return m_Name; } set { m_Name = value; OnPropertyChanged("Name"); } } public override string ToString() { return Name; } private ObservableCollection<ListItem> m_Children = new ObservableCollection<ListItem>(); public ObservableCollection<ListItem> Children { get { return m_Children; } } } public class MainViewModel : ViewModelBase { private ListItem m_RootItem; public ListItem RootItem { get { return m_RootItem; } private set { m_RootItem = value; OnPropertyChanged("RootItem"); } } public MainViewModel() { ReLoad(); } public void ReLoad() { int id = 0; m_RootItem = new ListItem { Id = id, Name = "TreeViewRoot" }; id++; ListItem m_root = new ListItem { Id = id, Name = "Root" }; m_RootItem.Children.Add(m_root); id++; for (int i = 0; i < 2; i++) { ListItem tmp_i = new ListItem { Id = id, Name = "Level=1, Order=" + i.ToString() }; id++; m_root.Children.Add(tmp_i); for (int j = 0; j < 10; j++) { ListItem tmp_j = new ListItem { Id = id, Name = "Level=2, Order=" + j.ToString() }; id++; tmp_i.Children.Add(tmp_j); for (int k = 0; k < 10; k++) { ListItem tmp_k = new ListItem { Id = id, Name = "Level=3, Order=" + k.ToString() }; id++; tmp_j.Children.Add(tmp_k); } } } OnPropertyChanged("RootSignals"); } }
    Mutasd a teljes hozzászólást!
  • Megmondom őszintén nem próbáltam ki a megoldásod, csak átnéztem...bizonyára működőképes :)

    Én más megoldást alkalmaztam tekintve, hogy a beágyazott lista az utolsó listaelemben szerepel(azaz ott kell lennie). Fogtam egy FlowDocument-et, két listát beletettem. A másodikra style trükkel megoldottam, hogy olyan hatást kapjak, mintha be lenne ágyazva. (margin, meg egy új markerstyle)

    Köszönöm a segítséget nektem!
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd