2010-02-24 17 views
6

मुझे यकीन है यह कई बार से अधिक उत्तर दिया गया है में एक ApplicationCommand संभाल, लेकिन ...WPF - ViewModel

जहां एक UserControl पर एक बटन अपने आदेश संपत्ति ढूँढें की तरह कुछ करने के लिए सेट है एक साधारण स्थिति के लिए (ApplicationCommands ढूँढें) ViewModel उस कमांड को कैसे संभालेगा? मैं आमतौर पर कमांड बाइंडिंग के साथ वायर्ड हैंडलर को वायर्ड करता हूं जो UIElement पर कमांडबिंडिंग संग्रह में जोड़ा जाता है, लेकिन मेरा व्यूमोडेल UIElement (इसे चाहिए?) से प्राप्त नहीं होता है। आदेश स्वयं निष्पादित होने पर सूचित करने के लिए घटनाओं का पर्दाफाश नहीं करते हैं, इसलिए मुझे यह जानकारी प्राप्त करने के लिए कहां से तार करना चाहिए?

संपादित करें: यदि संभव हो तो समस्या को हल करने के लिए मैं स्टॉक डब्ल्यूपीएफ का उपयोग करना चाहता हूं। मुझे पता है कि इस तरह की चीज के लिए कई उपलब्ध ढांचे हैं लेकिन कोड को सरल रखना चाहते हैं।

EDIT2: कुछ नमूना कोड सहित।

<UserControl> 
    <UserControl.DataContext> 
    <local:MyViewModel/> 
    </UserControl.DataContext> 

    <Button Command="Find"/> 
</UserControl> 

कहाँ:

class MyViewModel 
{ 
    // Handle commands from the view here. 
} 

मैं UserControl जो निष्पादित संभाल होगा करने के लिए एक CommandBinding जोड़ सकता है, तो MyViewModel में एक काल्पनिक ढूँढें विधि है जो वास्तविक काम करता है कहते हैं, लेकिन यह है कि अतिरिक्त और अनावश्यक कोड है। अगर मैं ViewModel को ढूँढें कमांड को संभाला तो मैं चाहूंगा। एक संभावित समाधान होगा MyViewModel UIElement से प्राप्त होगा हालांकि यह काउंटर अंतर्ज्ञानी लगता है।

उत्तर

4

आदेशों का उद्देश्य कोड को डीक्यूपल करना है जो इसे निष्पादित करने वाले कोड से ऑर्डर उत्पन्न करता है। इसलिए: अगर आप तंग युग्मन चाहते, तो आप बेहतर यह घटनाओं के माध्यम से करना चाहिए:

<UserControl ... x:Class="myclass"> 
    ... 
    <Button Click="myclass_find" .../> 
    ... 
</UserControl> 

ढीला संयोजन के लिए आप जोड़ने की जरूरत है एक CommandBinding अपने UserControl रहे हैं:

<UserControl ... > 
    <UserControl.DataContext> 
     <local:MyViewModel/> 
    </UserControl.DataContext> 

    <UserControl.CommandBindings> 
     <Binding Path="myFindCommandBindingInMyViewModel"/> 
    </UserControl.CommandBindings> 
    ... 
    <Button Command="ApplicationComamnd.Find" .../> 
    ... 
</UserControl> 

(बारे में निश्चित नहीं वाक्यविन्यास)

या आप अपने UserControl के CommandBindings में कन्स्ट्रक्टर में CommandBinding जोड़ सकते हैं व्यू नोडेल से:

partial class MyUserControl : UserControl 
{ 
    public MyUSerControl() 
    { 
     InitializeComponent(); 
     CommandBinding findCommandBinding = 
        ((MyViewModel)this.DataContext).myFindCommandBindingInMyViewModel; 
     this.CommandBindings.Add(findCommandBinding); 
    } 
} 
+0

मैं ढीला युग्मन पसंद करूंगा इसलिए मैं एक ऐसा उत्तर ढूंढ रहा हूं जो उपयोगकर्ता नियंत्रण से अलग वर्ग में कमांड को संभालने का तरीका दिखाता है। –

+0

क्या आप सभी स्रोतों के लिए 'ApplicationCommands.Find' को संसाधित करना चाहते हैं? – Vlad

+0

स्पष्ट करने के लिए कुछ कोड जोड़ा गया है जहां मैं कमांड निष्पादन को संभालना चाहता हूं - मैं सामान्य एमवीवीएम दर्शन को ध्यान में रखते हुए UserControl में नहीं, ViewModel में कमांड को संभालना चाहता हूं। –

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