2009-08-29 12 views
122

मैं एक कमांड जो मैं निम्न मानक सिंटैक्स का उपयोग मेरी XAML फाइल से क्रियान्वित कर रहा हूँ:एक WPF का उपयोग कर दो आदेश पैरामीटर बाध्यकारी पासिंग

<Button Content="Zoom" Command="{Binding MyViewModel.ZoomCommand}"/> 

यह ठीक काम किया जब तक मुझे एहसास हुआ कि मैं से जानकारी के दो टुकड़े की जरूरत इस ऑपरेशन को उपयोगकर्ताओं द्वारा अपेक्षित तरीके से पूरा करने के लिए दृश्य (कैनवास की चौड़ाई और ऊंचाई)।

ऐसा लगता है कि यह मेरे आदेश के लिए एक तर्क के रूप एक सरणी पारित करने के लिए संभव है, लेकिन मैं वहाँ नहीं दिख रहा है CommandParameter में मेरे दो कैनवास गुण के लिए बाध्य निर्दिष्ट करने के लिए एक तरह से किया जा रहा है:

<Button Content="Zoom" 
     Command="{Binding MyViewModel.ZoomCommand" 
     CommandParameter={Binding ElementName=MyCanvas, Path=Width}"/> 

मैं अपने आदेश में चौड़ाई और ऊंचाई दोनों कैसे पास करूं? ऐसा लगता है कि XAML से कमांड का उपयोग करना संभव नहीं है और मुझे यह जानकारी मेरे ज़ूम विधि को पास करने के लिए मेरे कोडबेंड में एक क्लिक हैंडलर को तार करने की आवश्यकता है।

उत्तर

182

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

हालांकि, अगर आप भी बहु बाँध सकता है और एक कनवर्टर का उपयोग पैरामीटर बनाना:

: अपने आदेश निष्पादन तर्क में

public class YourConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, ...) 
    { 
     return values.Clone(); 
    } 

    ... 
} 

फिर,:

<Button Content="Zoom" Command="{Binding MyViewModel.ZoomCommand"> 
    <Button.CommandParameter> 
     <MultiBinding Converter="{StaticResource YourConverter}"> 
      <Binding Path="Width" ElementName="MyCanvas"/> 
      <Binding Path="Height" ElementName="MyCanvas"/> 
     </MultiBinding> 
    </Button.CommandParameter> 
</Button> 

अपने कनवर्टर में

public void OnExecute(object parameter) 
{ 
    var values = (object[])parameter; 
    var width = (double)values[0]; 
    var height = (double)values[1]; 
} 
+1

धन्यवाद केंट में पैरामीटर - कि था कि वास्तव में क्या मैं के लिए देख रहा था। मुझे आपका पहला दृष्टिकोण बेहतर पसंद है ताकि वीएम बिना किसी बाध्यकारी के दृश्य के "राज्य" को जानता हो, मुझे पैरामीटर पास करने के बिना, लेकिन मैं अभी भी इसका परीक्षण कर सकता हूं। मुझे यकीन नहीं है कि यह मेरे लिए यहां काम करने जा रहा है, क्योंकि मुझे जितना संभव हो सके कैनवास बनाने के लिए दृश्य की आवश्यकता है और वीएम को यह मान पास करें। अगर मैं इसे बांधता हूं, तो क्या मुझे वीएम में चौड़ाई निर्धारित नहीं करनी पड़ेगी? किस मामले में, वीएम दृश्य के लिए बाध्य है? – JasonD

+0

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

+0

मेरे प्रोग्राम में ऑनएक्सक्यूट विधि पैरामीटर शून्य मानों वाला एक सरणी है, लेकिन कनवर्टर में मानों की अपेक्षा की जाती है –

13

कनवर्टर में टुपल का उपयोग करें, और ऑनएक्सक्यूट में, पैरामीटर ऑब्जेक्ट को टुपल पर वापस डालें।

public class YourConverter : IMultiValueConverter 
{  
    public object Convert(object[] values, ...)  
    { 
     Tuple<string, string> tuple = new Tuple<string, string>(
      (string)values[0], (string)values[1]); 
     return (object)tuple; 
    }  
} 

// ... 

public void OnExecute(object parameter) 
{ 
    var param = (Tuple<string, string>) parameter; 
} 
35

चुना समाधान के कनवर्टर में, आप values.Clone जोड़ना चाहिए() अन्यथा आदेश अंत अशक्त

public class YourConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, ...) 
    { 
     return values.Clone(); 
    } 

    ... 
} 
+2

हाय, क्लोन() के साथ यह जोड़ा यह काम करता है :) क्या आप कृपया समझा सकते हैं, इससे क्या फर्क पड़ता है। बन गया मैं समझ नहीं पा रहा हूं कि क्लोन() को काम करने की आवश्यकता क्यों है? धन्यवाद। – adminSoftDK

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