2013-03-23 7 views
6

के साथ TreeView BringIntoView मैं चाहता हूं कि उपयोगकर्ता ट्री व्यू में आइटमों को खोजने में सक्षम हो। एक खोज टेक्स्ट दर्ज करने के बाद TreeViewItem को देखने में स्क्रॉल किया जाना चाहिए।एमवीवीएम

अभी मैं TreeViewItems और MainView के लिए TreeView के लिए एमवीवीएम पैटर्न का उपयोग कर रहा हूं।

एमवीवीएम का उपयोग कर BringIntoView की कार्यक्षमता प्राप्त करने के लिए मुझे क्या करना है? क्या कोई ऐसी संपत्ति है जिसे मैं बांध सकता हूं? (एमएफसी में फर्स्टविसिबिल इटैम की तरह कुछ था)

किसी व्यवहार के साथ "समाधान" देखा है। क्या यह वास्तव में जरूरी है?

+0

मुझे लगता है कि MVVM "चयनित" की अवधारणा पर बंद कर देना चाहिए। यदि वह आइटम को देखने में स्क्रॉल नहीं करता है, तो मैं दृश्य में नियमित घटनाओं का उपयोग करता हूं। –

+1

आप सही हैं, दृश्यमान को दृश्य के बारे में परवाह नहीं करना चाहिए। लेकिन यहां कुछ विशेष मामला है जो एमवीवीएम के "सीमाओं पर" है, मेरा मानना ​​है। –

+0

वीएम को एक निश्चित वस्तु का संकेत देना चाहिए, लेकिन यह है। दृश्य में स्क्रॉलिंग मुद्दों को बेहतर तरीके से निपटाया जाता है। –

उत्तर

5

समस्या को व्यवहार के साथ हल किया जा सकता है।

यह CodeProject article यह बहुत अच्छा वर्णन करता है और यह बॉक्स से बाहर काम करता है।

8

उल्लिखित कोड प्रोजेक्ट आलेख के अनुसार, यहां कोड उदाहरण है जो दिखाता है कि व्यवहार को कैसे स्थापित किया जाए और XAML में व्यवहार को कैसे एकीकृत किया जाए।

सेटअप व्यवहार:

/// <summary> 
/// Exposes attached behaviors that can be 
/// applied to TreeViewItem objects. 
/// </summary> 
public static class TreeViewItemBehavior 
{ 
    #region IsBroughtIntoViewWhenSelected 
    public static bool GetIsBroughtIntoViewWhenSelected(TreeViewItem treeViewItem) 
    { 
     return (bool)treeViewItem.GetValue(IsBroughtIntoViewWhenSelectedProperty); 
    } 

    public static void SetIsBroughtIntoViewWhenSelected(  TreeViewItem treeViewItem, bool value) 
    { 
     treeViewItem.SetValue(IsBroughtIntoViewWhenSelectedProperty, value); 
    } 

    public static readonly DependencyProperty IsBroughtIntoViewWhenSelectedProperty = 
    DependencyProperty.RegisterAttached(
    "IsBroughtIntoViewWhenSelected", 
    typeof(bool), 
    typeof(TreeViewItemBehavior), 
    new UIPropertyMetadata(false, OnIsBroughtIntoViewWhenSelectedChanged)); 

    static void OnIsBroughtIntoViewWhenSelectedChanged(DependencyObject depObj, DependencyPropertyChangedEventArgs e) 
    { 
     TreeViewItem item = depObj as TreeViewItem; 
     if (item == null) 
      return; 

     if (e.NewValue is bool == false) 
      return; 

     if ((bool)e.NewValue) 
      item.Selected += OnTreeViewItemSelected; 
     else 
      item.Selected -= OnTreeViewItemSelected; 
    } 

    static void OnTreeViewItemSelected(object sender, RoutedEventArgs e) 
    { 
     // Only react to the Selected event raised by the TreeViewItem 
     // whose IsSelected property was modified. Ignore all ancestors 
     // who are merely reporting that a descendant's Selected fired. 
     if (!Object.ReferenceEquals(sender, e.OriginalSource)) 
     return; 

     TreeViewItem item = e.OriginalSource as TreeViewItem; 
     if (item != null) 
      item.BringIntoView(); 
    } 

    #endregion // IsBroughtIntoViewWhenSelected 
} 

फिर XAML में TreeViewItemBehavior एकीकृत:

<TreeView.ItemContainerStyle> 
    <Style TargetType="{x:Type TreeViewItem}"> 
    <Setter Property="local:TreeViewItemBehavior.IsBroughtIntoViewWhenSelected" Value="True"/> 
    </Style> 
</TreeView.ItemContainerStyle> 

है मज़ा :-)

+0

निर्भरता संपत्ति के लिए सेटटर मेरे वृक्षदृश्य में आइटम पर लागू नहीं होता है जब तक वे उन्हें विस्तारित करके दिखाई नहीं दे रहे हैं। इसलिए, TreeViewItem.Selected प्रारंभ में एक घटना संलग्न नहीं है। अगर मेरे पास कोड है जो प्रोग्रामेटिक रूप से नोड्स का विस्तार करता है और पेड़ में एक गहराई का चयन करता है, तो इसे देखा नहीं जाता है। – DannyMeister

+0

मेरे विशिष्ट मामले के लिए एक प्रस्ताव मिला। यदि निर्भरता संपत्ति सक्षम की जा रही है, तो मेरे लिए आगे बढ़ना और आइटम को स्क्रॉल करना अगर यह पहले से ही चुना गया था। अगर, लाइन के बाद, 'item.elected + = OnTreeViewItem चयनित;' मैंने जोड़ा: 'अगर (item.Is चयनित) {item.RaiseEvent (नया रूटेड एवेन्ट आर्ट्स (TreeViewItem.SelectedEvent)); } ' – DannyMeister

+0

यह एक व्यवहार नहीं है, यह एक विस्तार है। TreeViewItem * व्यवहार * – Snicker