2012-07-18 10 views
5

Aktualnie aktualizuję narzędzie mojego poprzednika i utknąłem na numerze TreeView. Jego oprogramowanie przeanalizowało dane jeden raz i wyświetliło wyniki w postaci TreeView. Zmieniłem narzędzie, aby analizować dane w czasie rzeczywistym, dzięki czemu użytkownik uzyskuje wyniki w czasie rzeczywistym. Teraz chciałbym, aby węzły widoku drzewa były rozwijane, gdy użytkownik je rozwija, nawet po aktualizacji. Wiem, że ten temat był omawiany kilka razy i spędziłem godziny czytając odpowiedzi, ale nigdy nie znalazłem rozwiązania dla mojego problemu.Utwórz, odśwież drzewo widoku drzewa WPF i zapamiętaj rozwinięte węzły bez XAML

Podstawowy problem: nie ma już stabilnego drzewa i obecnie drzewo jest ponownie tworzone za każdym razem. Nie mam pojęcia o powiązaniu danych ani o XAML do tej pory, a także o kilku dniach nauki programowania w XAML. Poniżej możesz zobaczyć kod taki jak został stworzony przez mojego poprzednika. Do tej pory nic nie zmieniałem. Przypominam sobie tę metodę co 2-5 sekund.

Czy istnieje (łatwy?) Sposób przechowywania informacji o rozszerzonych węzłach w dowolnym miejscu (globalny?) I ponownie go rozwinąć po odświeżeniu lub czy naprawdę muszę najpierw lepiej zrozumieć WPF?

foreach (Analyzer.ALARM_GROUP alarmGroup in alarmGroupList) 
{ 
    //Display Problem Group 
    TreeViewItem groupItem = new TreeViewItem(); 
    List<String> ListAreas = new List<string>(); 
    string areas = ""; 

    //GROUP HEADER 
    //display alarm group which contains more than one alarm 
    if (alarmGroup.AlarmList.Count > 1) 
    { 
     groupItem.Header = Convert.ToString(alarmGroup.AlarmList.Count) + " --- " + alarmGroup.AlarmList[0].EventTime + "  " + alarmGroup.AlarmList[0].AlarmText + "\n   " 
        + alarmGroup.AlarmList[alarmGroup.AlarmList.Count - 1].EventTime + "  " + alarmGroup.AlarmList[alarmGroup.AlarmList.Count - 1].AlarmText 
        + " --- " + " AREAS: " + areas; 
    } 
    else //display alarm group with only one alarm message 
    { 
     groupItem.Header = Convert.ToString(alarmGroup.AlarmList.Count) + " --- " + alarmGroup.AlarmList[0].EventTime + "  " + alarmGroup.AlarmList[0].AlarmText + " --- " + " AREA: " + areas; 
    } 

    //HEADLINE of single Alarm Item 
    TreeViewItem alarmItem = new TreeViewItem(); 
    alarmItem.Header = "[EVENTTIME]       [ALARMTAG] --- [OPCCONDITION] --- [SEVERITY] --- [AREA] --- [ALARMTEXT]"; 
    alarmItem.FontWeight = FontWeights.SemiBold; 
    groupItem.Items.Add(alarmItem); 

    //Display single alarm messages 
    foreach (var alarm in alarmGroup.AlarmList) 
    { 
     alarmItem = new TreeViewItem(); 
     alarmItem.Header = alarm.EventTime + " --- " + alarm.AlarmTag + " --- " + alarm.Condition + " --- " + alarm.Severity + " --- " + alarm.Area + " --- " + alarm.AlarmText; 
     alarmItem.FontWeight = FontWeights.Normal; 
     groupItem.Items.Add(alarmItem); 
    } 

    AlarmPresentationBox.Items.Add(groupItem); 

Odpowiedz

3

czy naprawdę trzeba uzyskać głębsze zrozumienie WPF pierwszy?

Powiedziałbym tak, szczególnie w przypadku, gdy planujesz pracować/wspierać ten wniosek przez dłuższy czas; i jeśli chciałbyś pracować w WPF w przyszłości, lepiej zabrudzić sobie ręce koncepcjami XAML i WPF.

Osobiście nigdy bym wdrożenie tego narzędzia w ten sposób, zamiast tego pójdę do MVVM approch jak opisano w poniższym artykule i sprawiają, że czyste, utrzymaniu i wydajny - Simplifying the WPF TreeView by Using the ViewModel Pattern

Czy istnieje (proste?) sposób, aby przechowywać informacje o rozbudowanych węzłów gdziekolwiek (? globalne) i ponownie go rozwinąć po odświeżeniu

można spróbować coś takiego -

Tworzenie listy do przechowywania nagłówka (lub dowolną unikalną nieruchomość/ID) rozbudowanych węzłów

private List<string> expandedNodes = new List<string>(); 

Uchwyt rozszerzonego i upadł wydarzenie każdym węźle (zawierającego węzły potomne)

TreeViewItem alarmItem = new TreeViewItem(); 
alarmItem.Expanded += OnAlarmItemExpanded; 

zaktualizować listę ilekroć węzeł jest rozwinięty/zawalił -

private void OnAlarmItemExpanded(object sender, RoutedEventArgs e) 
{ 
    TreeViewItem treeNode = sender as TreeViewItem; 
    string header = treeNode.Header.ToString(); 
    if (expandedNodes.Contains(header) == false) 
    { 
     expandedNodes.Add(header); 
    } 
} 

private void OnAlarmItemCollapsed(object sender, RoutedEventArgs e) 
{ 
    TreeViewItem treeNode = sender as TreeViewItem; 
    string header = treeNode.Header.ToString(); 
    if (expandedNodes.Contains(header)) 
    { 
     expandedNodes.Remove(header); 
    } 
} 

Następnym razem, gdy tworzysz TreeViewItem, rozwiń ją, czy jest to nagłówek (Uniques Id) jest obecny na liście -

if (expandedNodes.Contains(header)) 
{ 
    alarmItem.IsExpanded = true; 
} 

Należy to zrobić dla elementu groupItem i alarmuItem.

+0

Dziękuję bardzo.Po prostu próbowałem innego podejścia, podłączając całe drzewo i przechowując węzły oraz jego status w słowniku, ale to nie zadziałało. Twoje podejście brzmi lepiej. Właśnie go wdrażam. – Larimow

+0

Dziękuję jeszcze więcej. Działa idealnie. Powinienem był zadać to pytanie 3 dni wcześniej ... O WPF: W tej chwili jest jeszcze dwa inne problemy. Kiedy rozwiązałem te problemy, mogę "zabrudzić sobie ręce". Na razie staram się unikać XAML – Larimow

+0

Dobre rozwiązanie. Ale lepiej użyj zamiast tego GetHashCode. ciąg nagłówka nie jest bardzo unikalnym identyfikatorem. – shj

-1

CompareTreeViewItem -

private void CompareTreeViewItem(TreeViewItem TViewItem1,TreeViewItemTViewItem2) 
{ 
    if ((string)TViewItem1.Header == (string)TViewItem2.Header) 
    { 
     TViewItem2.IsExpanded = TViewItem1.IsExpanded; 

     if (TViewItem1.Items.Count > 0) 
     { 
      for (int i = 0; i < TViewItem1.Items.Count && i < TViewItem2.Items.Count; i++) 
      { 
       CompareTreeViewItem((TreeViewItem)TViewItem1.Items[i], 
            (TreeViewItem)TViewItem2.Items[i]); 
      } 
     } 
    } 
} 
Powiązane problemy