2010-02-15 15 views
9

से जुड़ा हुआ है, मैं डब्ल्यूपीएफ में अपना पहला एमवीवीएम एप्लीकेशन बनाने में व्यस्त हूं।डब्ल्यूपीएफ: ट्री व्यूइटम एक आईसीओएमएंड

असल में मेरी समस्या यह है कि मेरे पास एक TreeView (System.Windows.Controls.TreeView) है जिसे मैंने अपनी WPF विंडो पर रखा है, मैंने फैसला किया है कि मैं CommandViewModel आइटम्स के ReadOnlyCollection से जुड़ जाऊंगा, और ये आइटम में डिस्प्लेस्ट्रिंग, टैग और रिले कॉमांड शामिल हैं।

अब एक्सएएमएल में, मेरे पास मेरा ट्री व्यू है और मैंने सफलतापूर्वक मेरे ReadOnlyCollection को बाध्य कर दिया है। मैं इसे देख सकता हूं और सब कुछ यूआई में ठीक दिखता है।

अब मुद्दा यह है कि मुझे रिलेकॉमैंड को ट्री व्यूइटम के कमान पर बांधने की ज़रूरत है, हालांकि मैं देख सकता हूं कि ट्री व्यूइटम के पास कमांड नहीं है। क्या यह मुझे IsSelected संपत्ति में या TreeView_SelectedItemChanged विधि के पीछे कोड में करने के लिए मजबूर करता है या क्या यह WPF में जादूगर रूप से ऐसा करने का कोई तरीका है?

इस कोड को मेरे पास है:

<TreeView BorderBrush="{x:Null}" 
     HorizontalAlignment="Stretch" 
     VerticalAlignment="Stretch"> 
<TreeView.Items> 
    <TreeViewItem 
     Header="New Commands" 
     ItemsSource="{Binding Commands}" 
     DisplayMemberPath="DisplayName" 
     IsExpanded="True"> 
    </TreeViewItem> 
</TreeView.Items> 

और आदर्श मैं बस जाने के लिए प्यार होता है:

<TreeView BorderBrush="{x:Null}" 
     HorizontalAlignment="Stretch" 
     VerticalAlignment="Stretch"> 
<TreeView.Items> 
    <TreeViewItem 
     Header="New Trade" 
     ItemsSource="{Binding Commands}" 
     DisplayMemberPath="DisplayName" 
     IsExpanded="True" 
     Command="{Binding Path=Command}"> 
    </TreeViewItem> 
</TreeView.Items> 

कोई एक समाधान है कि मुझे अनुमति देता है मेरे पास रिलेकॉमैंड इंफ्रास्ट्रक्चर का उपयोग करने के लिए।

धन्यवाद दोस्तों, बहुत सराहना की!

रिचर्ड

उत्तर

2

मुद्दे में इनपुट के लिए धन्यवाद, और हाँ, मैं कहता हूँ कि मैं समाधान के पीछे एक कोड नहीं करना चाहता था, हालांकि उस समय मैं अभी भी था पर इस धारणा के तहत बहुत कुछ कि मैं बस कुछ खो रहा था ... इसलिए मैं TreeView_SelectedItemChanged ईवेंट का उपयोग कर समाप्त हुआ।

भले ही विल का दृष्टिकोण चारों ओर एक अच्छा काम जैसा लगता है, मेरी व्यक्तिगत स्थिति के लिए मैंने फैसला किया कि मैं पीछे कोड का उपयोग करूंगा। इसका कारण यह है कि व्यू और एक्सएएमएल रहेगा क्योंकि यह होगा यदि ट्री व्यूइटम के पास "कमांड" संपत्ति थी जिसके लिए मेरा कमान बाध्य हो सकता था। अब मुझे टेम्पलेट्स या दृश्यों को बदलने की ज़रूरत नहीं है, मुझे बस इतना करना है कि कोड और ईवेंट को TreeView_SelectedItemChanged के लिए जोड़ना है।

मेरे समाधान:

private void TreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e) 
    { 
     if (sender != null) 
     { 
      var treeView = sender as TreeView; 
      if (treeView != null) 
      { 
       var commandViewModel = treeView.SelectedItem as CommandViewModel; 
       if (commandViewModel != null) 
       { 
        var mi = commandViewModel.Command.GetType().GetMethod("Execute"); 
        mi.Invoke(commandViewModel.Command, new Object[] {null}); 
       } 
      } 
     } 
    } 

मैं पहले से ही RelayCommand TreeViewItem से जुड़ी है के रूप में, सब मैं अब कर रहा हूँ बस मैन्युअल रूप से है कि विशिष्ट RelayCommand पर "निष्पादित" विधि को लागू करने की है।

यदि यह इसके बारे में जा रहा है तो कृपया मुझे बताएं की पूरी तरह से गलत तरीके से ...

धन्यवाद है!

+1

मुझे एएसपी.NET वृक्षदृश्य के साथ विश्वास है कि आप इस तरह की कार्यक्षमता जोड़ने के लिए TreeView और TreeViewItem का विस्तार कर सकते हैं। आप टीवीआई को अपनी जरूरतों को जोड़ने के लिए बदल देंगे और फिर अपने टीवीआई का एक नया उदाहरण बनाने के लिए टीवी में एक विधि को ओवरराइड करेंगे। मुझे नहीं पता कि डब्ल्यूपीएफ वृक्षदृश्य में एक ही पैटर्न उपलब्ध है या नहीं; मैंने जांच की लेकिन पूरी तरह से नहीं। – Will

1

मुझे क्या होता TreeViewItem की the Header सेट किया गया है, एक बटन हो तो बटन त्वचा इतना है कि यह देखने के लिए नहीं करता है या एक तरह काम करते हैं, तो बटन के खिलाफ बाध्यकारी मेरे आदेश प्रदर्शन करने के लिए।

आपको डेटा टेम्पलेट के माध्यम से ऐसा करने की आवश्यकता हो सकती है, या आपको TreeViewItem के टेम्पलेट को बदलने की आवश्यकता हो सकती है। इसे कभी नहीं किया, लेकिन इस तरह मैंने इसी तरह की चीजें की हैं (जैसे टैब पेज हेडर)।

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Page.Resources> 
     <Style x:Key="ClearButan" TargetType="Button"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="Button">    
       <Border Name="border" 
        Padding="4" 
        Background="transparent"> 
        <Grid > 
        <ContentPresenter HorizontalAlignment="Center" 
            VerticalAlignment="Center"> 
        </ContentPresenter> 
        </Grid> 
       </Border> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
     </Style> 
    </Page.Resources> 
    <Grid> 
     <TreeView> 
     <TreeViewItem> 
      <Button Style="{StaticResource ClearButan}"> 
      easy peasy 
      </Button> 
     </TreeViewItem> 
     </TreeView> 
    </Grid> 
</Page> 

मैं एक बटन के लिए एक नया स्पष्ट शैली बना लिया है:


यहाँ मैं किस बारे में बात कर रहा हूँ (आप Kaxaml में इस ड्रॉप और इसके साथ चारों ओर खेल सकते हैं) का एक उदाहरण है। मैं फिर टीवीआई में एक बटन छोड़ देता हूं और अपनी शैली निर्धारित करता हूं। आप निश्चित रूप से डेटा टेम्पलेट का उपयोग कर एक ही काम कर सकते हैं।

+0

हाय, मैं देखता हूं कि आप क्या करने की कोशिश कर रहे हैं, और त्वरित प्रतिक्रिया की सराहना करते हैं, लेकिन क्या यह वास्तव में सबसे अच्छा समाधान है? मैंने नेट को उच्च और निम्न खोजा है और इसे करने का अच्छा तरीका नहीं मिल रहा है! इसे कष्टप्रद कहना है कि यह अभी बनाया गया है। लेकिन कम से कम आपने इसे करने का एक तरीका प्रदान किया है, लेकिन अब आप बटन दिखाने के लिए हेडर कैसे प्राप्त करते हैं, और बाध्य पाठ? – Richard

+0

@richard नमूना – Will

+1

के साथ अपडेट किया गया धन्यवाद अद्यतन के लिए होगा और मुझे लगता है कि यह शायद काम करेगा। मैं एक अलग मार्ग चला गया हूं, लेकिन बहुत मदद की सराहना करता हूं। उम्मीद है कि यह किसी और की मदद करेगा जिसके पास यह समस्या है। – Richard

0

यह एक अच्छा उदाहरण है कि कैसे एमवीवीएम डब्ल्यूपीएफ में एक विचार के बाद बहुत अधिक है। आप उम्मीद करते हैं कि कुछ गुई वस्तुओं का कमांड समर्थन होगा, लेकिन ऐसा नहीं है, इसलिए आपको कुछ विस्तृत प्रक्रिया के लिए एक विस्तृत प्रक्रिया (जैसा कि विल के उदाहरण में दिखाया गया है) के माध्यम से जाने के लिए मजबूर होना पड़ता है।

आइए आशा वे WPF में इसका समाधान 2.0 :-)

+4

एमवीवीएम डब्ल्यूपीएफ के बाद आया, इसलिए यह बिल्कुल "बाद विचार" नहीं था, यह एमवीसी के सिद्धांतों को WPF में लागू करने का एक तरीका था। इसके अलावा, यह वृक्षदृश्य की कमी की अधिक है कि डब्ल्यूपीएफ। वृक्षारोपण इस तरह के उपयोग के लिए विकसित नहीं किया गया था, जो कि थोड़े से कम दिखने वाला इमो था। – Will

23

मुझे पता है कि यह थोड़ी देर पहले "उत्तर दिया गया था, लेकिन चूंकि उत्तर आदर्श नहीं थे, मुझे लगा कि मैं अपने दो सेंट डाल दूंगा। मैं एक विधि का उपयोग करता हूं जो मुझे किसी भी "स्टाइल बटन ट्रिकरी" या यहां तक ​​कि कोड-बैक का उपयोग करने की अनुमति नहीं देता है और इसके बजाय मेरे सभी अलगाव एमवीवीएम में रखता है। अपने TreeView में निम्नलिखित XAML जोड़ें:

<i:Interaction.Triggers> 
    <i:EventTrigger EventName="SelectedItemChanged"> 
     <i:InvokeCommandAction Command="{Binding TreeviewSelectedItemChanged}" CommandParameter="{Binding ElementName=treeView, Path=SelectedItem}"/> 
    </i:EventTrigger> 
</i:Interaction.Triggers> 

अपने XAML हैडर ऐड में:

xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 

और फिर आप अपनी परियोजना में ऊपर विधानसभा के लिए एक संदर्भ जोड़ने के लिए होगा।

उसके बाद, सब कुछ ठीक उसी तरह कार्य करता है जैसे कोई अन्य आदेश बटन या कुछ कहता है।

+0

+1 - यह एक अच्छा जवाब है क्योंकि यह कोड-पीछे समाधान नहीं है। हालांकि, यह बॉक्स आउट ऑफ़ द बॉक्स समाधान नहीं है :( – TheCloudlessSky

+0

'System.Windows.Interactivity' पुनर्वितरण योग्य है? – AMissico

+0

हां, "सी: \ प्रोग्राम फ़ाइलें (x86) \ Microsoft SDKs \ Expression \ Blend \ देखें। NETFramework \ v4.0 \ Redist.en.txt " – AMissico

संबंधित मुद्दे