2012-07-18 11 views
5

के बिना विस्तारित नोड्स को याद रखें, मैं वर्तमान में अपने पूर्ववर्ती के उपकरण को अपग्रेड कर रहा हूं और मैं TreeView समस्या पर फंस गया हूं। उनके सॉफ़्टवेयर ने एक बार डेटा का विश्लेषण किया और परिणामों को TreeView में प्रदर्शित किया। मैंने रीयल-टाइम डेटा का विश्लेषण करने के लिए टूल को बदल दिया और इसलिए उपयोगकर्ता को वास्तविक समय के परिणाम मिलते हैं। अब, जब मैं उपयोगकर्ता को विस्तार के बाद भी विस्तारित करता हूं तो पेड़ दृश्य नोड्स को विस्तारित करना चाहूंगा। मुझे पता है कि इस विषय पर कई बार चर्चा की गई है और मैंने जवाब पढ़ने में घंटों बिताए लेकिन मुझे अपनी समस्या का कोई समाधान नहीं मिला।एक WPF TreeView बनाएं, रीफ्रेश करें और XAML

बुनियादी समस्या है: कोई स्थिर पेड़ किसी भी अधिक और वर्तमान में पेड़ सिर्फ फिर से बनाई गई है हर बार होती है। मुझे डेटा बाध्यकारी या एक्सएएमएल के बारे में कोई जानकारी नहीं है और एक्सएएमएल में प्रोग्रामिंग सीखने के लिए कुछ समय है। नीचे आप कोड को देख सकते हैं जैसे कि यह मेरे पूर्ववर्ती द्वारा बनाया गया था। मैंने अभी तक कुछ भी नहीं बदला है, मुझे बस हर 2-5 सेकंड में इस विधि को याद है।

क्या विस्तारित नोड्स (ग्लोबल?) के बारे में जानकारी संग्रहीत करने के लिए कोई (आसान?) तरीका है और रीफ्रेश के बाद इसे फिर से विस्तारित करें या क्या मुझे वास्तव में 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); 

उत्तर

3

मैं वास्तव में पहले WPF की एक गहरी समझ पाने के लिए की जरूरत है?

मैं हाँ कहूंगा, विशेष रूप से यदि आप लंबे समय तक इस एप्लिकेशन को काम/समर्थन करने की योजना बना रहे हैं; और यदि आप भविष्य में डब्ल्यूपीएफ में काम करना चाहते हैं तो XAML और WPF अवधारणाओं के साथ अपने हाथों को गंदे करना बेहतर होगा।

व्यक्तिगत रूप से, मैं इस उपकरण का इस तरह से लागू न हो, बजाय मैं निम्न आलेख में वर्णित के रूप MVVM approch के लिए जाने के लिए और होगा यह, स्वच्छ पोषणीय और कुशल - Simplifying the WPF TreeView by Using the ViewModel Pattern

वहाँ एक (आसान है?) है

- कहीं भी (? वैश्विक) का विस्तार किया नोड्स के बारे में जानकारी स्टोर करने के लिए और यह ताज़ा करने के बाद फिर से विस्तार रास्ता

आप कुछ इस तरह की कोशिश कर सकते एक हैडर स्टोर करने के लिए (या किसी भी अद्वितीय संपत्ति/आईडी) का विस्तार किया नोड्स के

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

प्रत्येक नोड की विस्तारित और संक्षिप्त किए घटना संभाल (होने बच्चे नोड्स)

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

अद्यतन सूची जब भी सूची बनाएं नोड का विस्तार होता है/ढह -

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); 
    } 
} 

अगली बार जब भी आप एक TreeViewItem बनाने के लिए, यह विस्तार अगर यह हैडर (Uniques आईडी) है सूची में मौजूद है -

+०१२३५१६४१०
if (expandedNodes.Contains(header)) 
{ 
    alarmItem.IsExpanded = true; 
} 

यह समूह Item और alarmItem दोनों के लिए किया जाना आवश्यक है।

+0

आपको बहुत बहुत धन्यवाद।मैंने पूरी ट्री को हुक करके और नोड्स और इसकी स्थिति को एक शब्दकोश में संग्रहीत करके एक अलग दृष्टिकोण की कोशिश की लेकिन यह काम नहीं किया। आपका दृष्टिकोण बेहतर लगता है। मैं बस इसे लागू कर रहा हूँ। – Larimow

+0

आपको और भी धन्यवाद। यह पूरी तरह से काम करता है। मैं 3 दिन पहले इस प्रश्न पूछा जाना चाहिए था ... WPF के बारे में: इस समय से निपटने के लिए दो कई अन्य समस्याएं हैं। जब मैंने इन समस्याओं को हल किया तो मैं "हाथों को गंदे" कर सकता हूं। अभी के लिए मैं XAML – Larimow

+0

अच्छा समाधान से बचने की कोशिश करता हूं। लेकिन मैं इसके बजाय GetHashCode का बेहतर उपयोग करूंगा। हेडर स्ट्रिंग बहुत ही अद्वितीय आईडी नहीं है। – 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]); 
      } 
     } 
    } 
} 
संबंधित मुद्दे