2009-05-15 16 views
5

मैं पहली बार एमवीवीएम पैटर्न का उपयोग करने की कोशिश कर रहा हूं। तो मेरे पास ItemsControl है जो मेरे व्यूमोडेल ऑब्जेक्ट से भरा हुआ है, DataTemplate का उपयोग करके प्रदर्शित किया गया है; ऑब्जेक्ट्स "नोड्स" और "किनारों" DataTemplate में Thumb और Polyline ऑब्जेक्ट्स के साथ प्रदर्शित होते हैं और मैं नोड्स और किनारों को स्थानांतरित करने के लिए ItemsControl पर क्लिक और ड्रैग का पता लगाने में सक्षम होना चाहता हूं।डब्ल्यूपीएफ: माउस इवेंट को व्यूमोडेल में कैसे संलग्न करें?

दो सवाल:

  • मैं Polyline की और Thumb के लिए माउस ईवेंट हैंडलर्स कैसे देते हैं थोड़ा ViewModels द्वारा नियंत्रित किया जा करने के लिए? (मैं Thumb को ItemsControl और e.OriginalSource अंक के लिए एक Thumb.DragDelta हैंडलर देते हैं सकता है, लेकिन मैं कैसे इसी viewmodel वस्तु मिलता है?)
  • मैं कैसे ItemsControl करने के लिए माउस ईवेंट हैंडलर्स माउस क्लिक का पता लगाने के लिए देते हैं और रिक्त स्थान पर खींच लेता है कर ? (उत्तर नीचे है)

नोट: मुझे पता है कि यह उचित दृश्य मॉडल नहीं माना जा सकता है अगर यह सीधे दृश्य की घटनाओं को संभाला जा रहा है। लेकिन महत्वपूर्ण बात यह है कि, मुझे माउस की घटनाओं को संभालने की ज़रूरत है और मुझे यकीन नहीं है कि उन्हें कैसे संलग्न किया जाए।

उत्तर

2

मैंने दूसरे प्रश्न का उत्तर निकाला। मुझे एक आइटम्स कंट्रोल की आवश्यकता थी जो स्क्रॉलिंग का समर्थन करता था, और मुझे डिफ़ॉल्ट स्टैकपैनल की बजाय ग्रिड पर आइटम रखने की आवश्यकता थी। दोनों आवश्यकताओं को पूरा करने के लिए, मैं एक ControlTemplate प्रयोग किया है:

<!--In the resources...--> 
<ControlTemplate x:Key="GraphTemplate" TargetType="ItemsControl"> 
    <ScrollViewer Name="ScrollViewer" 
        Padding="{TemplateBinding Padding}" 
        HorizontalScrollBarVisibility="Auto"> 
     ... 
      <Grid Name="Panel" IsItemsHost="True" 
        Background="{TemplateBinding ItemsControl.Background}"/> 
     ... 
    </ScrollViewer> 
</ControlTemplate> 
<!--Later...--> 
<ItemsControl x:Name="_itemsControl" 
       ItemsSource="{Binding Items}" 
       Template="{StaticResource GraphTemplate}" 
       Background="LightYellow"/> 

सार्थक माउस निर्देशांक के साथ माउस घटनाओं प्राप्त करने के लिए (यानी निर्देशांक स्क्रॉल अंतरिक्ष में), यह ग्रिड एक अजीब जादू का उपयोग कर के लिए एक संदर्भ प्राप्त करने के लिए जरूरी हो गया था में:

Grid grid = (Grid)_itemsControl.Template.FindName("Panel", _itemsControl); 

फिर आप ईवेंट हैंडलर को ग्रिड में संलग्न करते हैं, और माउस ईवेंट हैंडलरों के अंदर, माउस निर्देशांक wrt प्राप्त करें

Point p = e.GetPosition((IInputElement)sender); 

क्रम पूरी सतह पर माउस घटनाओं प्राप्त करने के लिए का उपयोग कर ग्रिड, नियंत्रण (वास्तव में ग्रिड) एक पृष्ठभूमि होनी चाहिए, इसलिए मैं सेट पृष्ठभूमि = "LightYellow" ऊपर है, जो एक के माध्यम से ग्रिड के लिए प्रसारित ControlTemplate में बाध्यकारी।

6

मुझे डेटा टेम्पलेट में ऑब्जेक्ट्स द्वारा उठाए गए ईवेंट को संभालने का एक तरीका मिला।

(1) ItemsControl को ईवेंट हैंडलर्स देते

<ItemsControl x:Name="_itemsControl" 
       Thumb.DragStarted="Node_DragStarted" 
       Thumb.DragDelta="Node_DragDelta" 
       Thumb.DragCompleted="Node_DragCompleted" 
       MouseDoubleClick="OnMouseDoubleClick" 
       .../> 

(2) पता लगाने के लिए जो आइटम घटना, एक FrameworkElement रूप OriginalSource के इलाज के लिए लागू होता है, और उसके DataContext मिलती है:

void Node_DragStarted(object sender, DragStartedEventArgs e) 
{ 
    var os = (FrameworkElement)e.OriginalSource; 
    var vm = os.DataContext as ItemViewModel; 
    if (vm != null) 
     // do something with the item ViewModel 
} 
+2

+1 काम करने के लिए +1। – Ant

1

कोड-बैक के बिना ऐसा करने के तरीके हैं ...

आप आदेशों को घटनाओं के नक्शे से जुड़ी व्यवहार पैटर्न इस्तेमाल कर सकते हैं, मार्लन Grech के कार्यान्वयन को देखने here

तुम भी एक markup extension इस्तेमाल कर सकते हैं कि मैं InputBindings बाध्य करने के लिए लिखा था ViewModel, आदेशों को इस तरह:

<UserControl.InputBindings> 
    <MouseBinding Gesture="LeftClick" Command="{input:CommandBinding SomeCommand}"/> 
</UserControl.InputBindings> 

हालांकि मुझे यकीन नहीं है कि यह आपकी विशिष्ट जरूरतों को फिट करता है ...

+0

मुझे ऐसा नहीं लगता है, क्योंकि यह ग्राफिकल ऑब्जेक्ट्स बनाने और स्थानांतरित करने के लिए एक ग्राफिकल इंटरफ़ेस है, इसलिए मुझे माउस निर्देशांक की आवश्यकता है, और ड्रैगिंग प्रगति पर होने पर मुझे प्रतिक्रिया दिखाने की आवश्यकता है। – Qwertie

3

व्यूमोडेल को जीयूआई से डिस्कनेक्ट किया जाना चाहिए, इसलिए इसे नियंत्रण या माउसक्लिक के बारे में कुछ भी पता नहीं है।

दो विकल्प:

  • कॉल ViewModel में एक कमांड, के रूप में थॉमस
  • बाइंड ViewModel में एक संपत्ति के लिए अंगूठे का स्थिति ने सुझाव दिया, फिर जब WPF चारों ओर नियंत्रण चाल अद्यतन करेगा ViewModel में स्थिति मान।
+0

मैं देखता हूं, आप खुद अंगूठे कैसे ले जाएंगे? – Qwertie

+0

एक जंगली अंगूठे नियंत्रण बनाने के उदाहरण के लिए http://www.codeproject.com/KB/WPF/WPFDiagramDesigner_Part1.aspx देखें। –

+0

वह प्रोजेक्ट ड्रैगडेल्टा ईवेंट को संभालने से बस कोड-बैक में अंगूठे को स्थानांतरित करता है। – Qwertie

1

बीए स्टॉलनिट्ज़ में एक ड्रैग और ड्रॉप उदाहरण है, "मैं डेटा बाउंड आइटम्स नियंत्रणों के बीच आइटम कैसे खींच सकता हूं और छोड़ सकता हूं?"। मैं लिंक पोस्ट करूंगा, लेकिन स्टैक ओवरफ्लो मुझे नहीं दे रहा है।

ड्रैगिंग प्रक्रिया में होने पर आप यूआई फीडबैक को विभाजित करना चाहते हैं और आखिर में जब इसे हटा दिया जाता है तो कार्रवाई की जाती है।

हालांकि मैं उपरोक्त डब्ल्यू/थॉमस और कैमरून से सहमत हूं। आप ईवेंट हैंडलिंग और डेटा बाध्यकारी के मिश्रण/मिलान को सीमित करना चाहते हैं। यदि आप ईवेंट हैंडलिंग मार्ग पर जा रहे हैं, तो हो सकता है कि आप अपनी ऑब्जेक्ट्स के लिए "मॉडल देखें" शब्द का उपयोग न करें, क्योंकि यह आम तौर पर डेटा बाध्यकारी विकल्प को दर्शाता है।

+0

लिंक: http://bea.stollnitz.com/blog/?p=53 – Qwertie

+0

यह वास्तव में मेरे लिए उपयोगी नहीं है लेकिन दिलचस्प लेख के लिए धन्यवाद! – Qwertie

0

मैं एक और अधिक सुरुचिपूर्ण विधि का उपयोग कर रहा हूं। मैं प्रिज्म 2 और डेटामैट्स का उपयोग करता हूं। तो क्या मैंने किया है यह है:

<ItemsControl x:Name="SearchImagesList" ItemTemplate="{StaticResource SearchResultsAlbum}" 

और ItemTemplate में मैं सिर्फ एक बटन के अंदर बनाया!

<DataTemplate x:Key="SearchResultsAlbum">       
    <Button CommandParameter="{Binding}"     
      Command="{Binding Source={x:Static PhotoBookPRMainModule:ServiceProvider.DesignEditorViewManager}, Path=NavigationCommands.NavigateSearchResultAction}"> 
संबंधित मुद्दे