2012-06-16 30 views
5

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

<Window.Resources> 
    <RoutedUICommand x:Key="GetMusic" /> 
</Window.Resources> 
<Window.DataContext> 
    <core:ViewMain /> 
</Window.DataContext> 
<Window.CommandBindings> 
    <CommandBinding Command="{StaticResource GetMusic}" Executed="GetMusicExecuted"/> 
</Window.CommandBindings> 

और दृश्य मॉडल अभी बहुत ज्यादा कुछ भी नहीं है

public class ViewMain 
{ 
    public MusicCollection Music { get; set; } 

    private void GetMusicExecuted(object sender, ExecutedRoutedEventArgs e) 
    { 
     //Logic 
    } 
} 

अब मैं क्या करने की कोशिश कर रहा हूँ तार ऊपर इस आदेश मैं अपने आदेश बाइंडिंग बस अपना निष्पादित विधि कॉल करने में स्थापित किया है मेरे दृश्य मॉडल में, हालांकि यह उस विधि को स्वयं ही देखने में कोशिश करता है। क्या कोई तरीका है कि मैं इसे अपने दृश्य मॉडल में विधि के लिए निर्देशित कर सकता हूं, या एक ही चीज़ को पूरा करने के लिए इसे स्थापित करने का एक बेहतर तरीका है? इसे पहले आसान रखने की उम्मीद है इसलिए मैं अपने दिमाग को बहुत जल्दी नहीं उड़ाता हूं।

+0

आप सेटअप की जरूरत है बाध्यकारी या तो XAML के माध्यम से या – uowzd01

+0

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

उत्तर

11

मैं आईसीओएमएंड को लागू करने, अपनी खुद की कमांड कक्षा का उपयोग करता हूं। फिर मैं बटन कमांड प्रॉपर्टी को अपने व्यू मॉडल में कमांड प्रॉपर्टी से जोड़ता हूं। जब बटन क्लिक किया जाता है, तो यह निष्पादन विधि निष्पादित करता है जो कमांड प्रॉपर्टी से जुड़ा हुआ है।

यह बदसूरत दो मिनट का संस्करण है, लेकिन यह दिखाता है कि आप कमांड क्लास कैसे बना सकते हैं और उसके बाद इसे प्रतिनिधियों को असाइन कर सकते हैं जो आपके दृश्य मॉडल पर जो भी तरीका पसंद करते हैं उसे वापस इंगित करते हैं।

ViewModel:

public class MyViewModel 
{ 
    public MyCommand ActionCommand 
    { 
     get; 
     set; 
    } 

    public MyViewModel() 
    { 
     ActionCommand = new MyCommand(); 
     ActionCommand.CanExecuteFunc = obj => true; 
     ActionCommand.ExecuteFunc = MyActionFunc; 
    } 

    public void MyActionFunc(object parameter) 
    { 
     // Do stuff here 
    } 

} 

public class MyCommand : ICommand 
{ 
    public Predicate<object> CanExecuteFunc 
    { 
     get; 
     set; 
    } 

    public Action<object> ExecuteFunc 
    { 
     get; 
     set; 
    } 

    public bool CanExecute(object parameter) 
    { 
     return CanExecuteFunc(parameter); 
    } 

    public event EventHandler CanExecuteChanged; 

    public void Execute(object parameter) 
    { 
     ExecuteFunc(parameter); 
    } 
} 

देखें thusly यह करने के लिए बाध्य होगा (यह मानते हुए कि DataContext दृश्य मॉडल का एक उदाहरण के लिए सेट है):

<Window x:Class="exp.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <Button Command="{Binding Path=ActionCommand}">Action</Button> 
    </Grid> 
</Window> 
+0

अच्छा लगता है, इस मामले में आप प्रत्येक कमांड के लिए आधार के रूप में MyCommand का उपयोग कर रहे हैं क्योंकि आप प्रत्येक के लिए निष्पादित करने के लिए एक अलग फ़ंक्शन भेज सकते हैं? –

+1

थाई मामले में, हाँ। फिर आपको बहुत से कमांड क्लास बनाने की ज़रूरत नहीं है यदि आप जो करना चाहते हैं वह आपके व्यू मॉडल पर मौजूदा विधि को कॉल करना है। यदि आप चाहें तो आप अलग-अलग आदेश बना सकते हैं। – Japple

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