2010-06-22 7 views
6

मुझे एमवीवीएम पैटर्न के साथ नियंत्रण पर माउस घटनाओं को संभालने के लिए वास्तव में 2 तरीके मिले।एमवीवीएम पैटर्न के साथ नियंत्रण पर माउस घटनाओं को संभालना - सर्वोत्तम अभ्यास -

MVVM लाइट टूलकिट http://mvvmlight.codeplex.com/

<i:Interaction.Triggers> 
    <i:EventTrigger EventName="SelectionChanged"> 
     <cmd:EventToCommand 
      Command="{Binding SelectionChangedCommand}" 
      CommandParameter="{Binding SelectedItems, 
       ElementName=MyDataGrid}" /> 
    </i:EventTrigger> 
</i:Interaction.Triggers> 

द्वारा और व्यवहार के साथ ब्लेंड interactivity.dll

<i:Interaction.Triggers> 
    <i:EventTrigger EventName=”MouseLeftButtonDown”> 
    <Behaviours:ExecuteCommandAction Command=”{Binding MyCommand}” CommandParameter=”{Binding MyCommandParameter}”/> 
    </i:EventTrigger> 
</i:Interaction.Triggers> 

आप किसी भी बेहतर तरीका के बारे में पता है:

दोनों तरीकों वास्तव में 1 जिस तरह से कर रहे हैं?

मॉडरेटर: कोड की आखिरी 6 xaml लाइनें क्यों दिखाई नहीं दे रही हैं? वे आईई और आयरन ब्राउज़र द्वारा निगल गए हैं। क्या आप उस कोड स्क्रिप्ट को ठीक करने के लिए व्यवस्थापक की रिपोर्ट करेंगे? यह अक्सर काम नहीं कर रहा है। साबित करें: http://img251.imageshack.us/img251/5236/errorxt.png

+0

स्टैक ओवरव्लो कोड पर कोड के रूप में पहचाना जाने और सही रूप से प्रारूपित करने के लिए चार रिक्त स्थान इंडेंट किए जाने चाहिए। मुझे लगता है कि आपको यह नहीं पता था, क्योंकि जिन लाइनों के बारे में आपने पूछा था वे बिल्कुल इंडेंट नहीं थे। मैंने इसे ठीक करने के लिए अपना प्रश्न संपादित किया। संपादक के शीर्ष पर एक बटन है जो आपको तुरंत इंडेंट करने देता है: यह आइकन सभी और शून्य है। –

+0

हमेशा के रूप में मैंने शून्य/एक बटन का उपयोग किया और कोड चिपकाया। – msfanboy

+0

फिर मुझे लगता है कि आपके पेस्ट के साथ कुछ गड़बड़ हुई है, क्योंकि यह संपादन टेक्स्ट बॉक्स में इंडेंट नहीं हुआ था। मैं अब शून्य/बटन बटन का कभी भी उपयोग नहीं करता इसलिए मैं यह जानता हूं कि यह कैसे काम करता है। –

उत्तर

8

यदि आप मनमाने ढंग से स्थानों में माउसडाउन को संभालने की आवश्यकता है तो यह करने के दोनों अच्छे तरीके हैं।

हालांकि इन स्थितियों में आम तौर पर कुछ और बहुत दूर हैं। आम तौर पर एक आसान तरीका है:

  • क्या आप सुनिश्चित हैं कि आपकी ऑब्जेक्ट वास्तव में बटन नहीं हैं जो बटन की तरह दिखाई नहीं दे रही हैं? यदि ऐसा है, तो उन्हें वास्तविक बटन ऑब्जेक्ट्स बनाएं और उन्हें इच्छित तरीके से देखने के लिए उन्हें टेम्पलेट करें।
  • क्या आप सुनिश्चित हैं कि आपकी वस्तुएं सूची में वस्तुओं के लिए केवल चयन क्षेत्र हैं? यदि ऐसा है, तो चयन क्षेत्रों का उपयोग करने के लिए ListControl से ListBox और restyle ListBoxItem से कंटेनर बदलें।
  • क्या आपके ऑब्जेक्ट्स ग्राफ़िकल पथ हैं जिन्हें चुना जा रहा है? एक ToggleButton का उपयोग करें जिसका सामग्री पथ ही है।

इसके कई अन्य उदाहरण हैं। असल में, ऐसी स्थिति को ढूंढना असामान्य है जिसमें एक माउसडाउन एक कमांड के लिए मानचित्र करता है और वही काम करने का क्लीनर तरीका नहीं है।

+0

आप माउसडाउन का उल्लेख करते हैं और अक्सर, माउस क्लिक के बारे में क्या? क्या उपरोक्त विधियां इसके लिए अच्छी नहीं हैं? मैं अक्सर एमवीवीएम और घटनाओं के संबंध में संलग्न व्यवहार के साथ माउस क्लिक देखता हूं। लेकिन उनको मुझे फॉर्म कोड करना होगा ... – msfanboy

+1

आप "माउस क्लिक" को कैसे परिभाषित करते हैं? डब्ल्यूपीएफ में, यह अवधारणा वास्तव में मौजूद नहीं है। आपके पास बटन क्लिक हैं, लेकिन माउस "क्लिक" जैसी कोई चीज़ नहीं है: माउस बटन नीचे और ऊपर अलग-अलग ईवेंट हैं। बटन क्लिक के लिए, आपको कमांड पर क्लिक ईवेंट को मैप करने के तरीके की आवश्यकता नहीं है क्योंकि बटन क्लास में पहले से ही कमांड प्रॉपर्टी है जिसका आप सीधे उपयोग कर सकते हैं। –

+1

क्षमा करें ऐसा लगता है कि मेरे कोड स्निपेट भ्रामक थे: MouseLeftButtonDown मैं कभी भी बटन के बारे में बात नहीं करना चाहता था ... मुझे पता है कि उनके पास एक कमांड प्रॉपर्टी है ... – msfanboy

7

हमेशा एक और विकल्प है। आप दृश्य के कोड-बैक में WPF ईवेंट को संभाल सकते हैं और ViewModel पर उपयुक्त विधि को कॉल कर सकते हैं। एमवीवीएम पैटर्न दृश्य की कोड-बैक फ़ाइल में कोई भी कोड लिखने से मना नहीं करता है।

WPF Application Framework (WAF) की ViewModel नमूना आवेदन से पता चलता है कि यह कैसे काम कर सकते हैं।

2

एक्सकॉमैंड ओपन सोर्स कोडप्लेक्स प्रोजेक्ट इस घटना आधारित कमांड/कमांड पैरामीटर बाइंडिंग से निपटने का बेहतर तरीका है। यहां प्राप्त करें, xcommand.codeplex.com

यहाँ नीचे दिए गए नमूना कोड है:

<Grid> 
    <TextBlock Margin="20,30,20,0" VerticalAlignment="Top" Height="80" x:Name="XTextBlock" 
      Foreground="{Binding FgColor, Mode=TwoWay}" 
      XCmd:MouseMove.Command="{Binding TextBlockPointerMovedCommand}" 
      XCmd:MouseLeftButtonDown.Command="{Binding TextBlockPointerPressedCommand}" 
      XCmd:MouseLeave.Command="{Binding TextBlockPointerExitedCommand}"  
      Text="{Binding Description, Mode=TwoWay}"> 
    </TextBlock> 
    <Grid Grid.Column="1" Background="{Binding BgColor, Mode=TwoWay}" 
      XCmd:MouseMove.Command="{Binding GridPointerMovedCommand}" 
      XCmd:MouseMove.CommandParameter="{Binding ElementName=XTextBlock, Path=Text}" 
      XCmd:MouseLeftButtonDown.Command="{Binding GridPointerPressedCommand}" 
      XCmd:MouseLeftButtonDown.CommandParameter="{Binding ElementName=XTextBlock, Path=Text}" 
      > 
    </Grid> 
</Grid> 

आशा इस उपयोगी होगा।

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