2017-07-28 3 views
9

अद्यतन: बस एक चेतावनी है, इस पर एक 500 अंक बोनस है कि अगर किसी को सिर्फ मुझे बताएंगे कि कैसे जेस्चर का उपयोग किए बिना इस कार्यक्षमता को लागू कर सकते हैं>मैं व्यूसेल के टैप किए गए ईवेंट को एक सामान्य फ़ंक्शन पर एक param भेज सकता हूं और उसके बाद उस व्यूसेल तत्व के लिए एक पिकर खोल सकता हूं?

मैं एक पिकर को खोलने के लिए एक ViewCell और एक इशारा पहचानकर्ता उपयोग कर रहा हूँ निम्नलिखित कोड के साथ। व्यूसेल में बाईं ओर एक लेबल और दाईं ओर एक लेबल क्षेत्र है जो ऐप शुरू होता है और बाद में पिकर के साथ जब व्यूसेल क्लिक किया जाता है।

XAML

<ViewCell x:Name="ati" Tapped="OpenPickerCommand"> 
    <Grid VerticalOptions="CenterAndExpand" Padding="20, 0"> 
     <Grid.GestureRecognizers> 
     <TapGestureRecognizer 
      Command="{Binding OpenPickerCommand}" 
      CommandParameter="{x:Reference atiPicker}" NumberOfTapsRequired="1" /> 
     </Grid.GestureRecognizers> 
     <local:LabelBodyRendererClass Text="Answer Time Interval" HorizontalOptions="StartAndExpand" /> 
     <Picker x:Name="atiPicker" IsVisible="false" HorizontalOptions="End" SelectedIndexChanged="atiPickerSelectedIndexChanged" ItemsSource="{Binding Times}"></Picker> 
     <local:LabelBodyRendererClass x:Name="atiLabel" HorizontalOptions="End"/> 
    </Grid> 
</ViewCell> 

<ViewCell x:Name="pti" Tapped="OpenPickerCommand"> 
    <Grid VerticalOptions="CenterAndExpand" Padding="20, 0"> 
     <Grid.GestureRecognizers> 
     <TapGestureRecognizer 
      Command="{Binding OpenPickerCommand}" 
      CommandParameter="{x:Reference ptiPicker}" NumberOfTapsRequired="1" /> 
     </Grid.GestureRecognizers> 
     <local:LabelBodyRendererClass Text="Phrase Time Interval" HorizontalOptions="StartAndExpand" /> 
     <Picker x:Name="ptiPicker" IsVisible="false" HorizontalOptions="End" SelectedIndexChanged="ptiPickerSelectedIndexChanged" ItemsSource="{Binding Times}"></Picker> 
     <local:LabelBodyRendererClass x:Name="ptiLabel" HorizontalOptions="End"/> 
    </Grid> 
</ViewCell> 

सी # यह CommandParameter

public SettingsPage() 
{ 
    InitializeComponent(); 
    BindingContext = new CommandViewModel(); 
} 

void atiPickerSelectedIndexChanged(object sender, EventArgs e) 
    { 
     var picker = (Picker)sender; 
     int selectedIndex = picker.SelectedIndex; 
     if (selectedIndex != -1) 
     { 
      App.DB.UpdateIntSetting(Settings.Ati, selectedIndex); 
      atiLabel.Text = AS.ati.Text(); 
     } 
    } 

void ptiPickerSelectedIndexChanged(object sender, EventArgs e) 
    { 
     var picker = (Picker)sender; 
     int selectedIndex = picker.SelectedIndex; 
     if (selectedIndex != -1) 
     { 
      App.DB.UpdateIntSetting(Settings.Pti, selectedIndex); 
      ptiLabel.Text = AS.pti.Text(); 
     } 
    } 


public class CommandViewModel: ObservableProperty 
{ 
    public ICommand openPickerCommand; 

    public CommandViewModel() 
    { 
     openPickerCommand = new Command<Picker>(PickerFocus); 
     //openPickerCommand = new Command(tapped); 
    } 

    public ICommand OpenPickerCommand 
    { 
     get { return openPickerCommand; } 
    } 

    void PickerFocus(Picker param) 
    { 
     param.Focus(); 
    } 
} 

मैं TapGestureRecognizers के उपयोग निकालना चाहते हैं, लेकिन मैं के साथ विभिन्न पिकर (अति, BTI, PTI आदि) के लिए काम करता है अभी भी कार्यक्षमता और लेआउट बनाए रखना चाहते हैं।

यह मेरे लिए सुझाव दिया गया है कि यह बेहतर होगा कि मैं इस तरह ViewCell के टेप घटना प्रयोग किया है:

Tapped="OnTapped" 

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

मैं यह कैसे कर सकता हूं इसका एक उदाहरण बहुत सराहना की जाएगी। ध्यान दें कि मुझे विशेष रूप से CommandViewModel का उपयोग करने की आवश्यकता नहीं है यदि कोई तरीका है कि मैं इसे .cs बैकिंग कोड में कोडिंग करके कर सकता हूं।

+2

आपको यहां विस्तृत विवरण मिला है https://stackoverflow.com/questions/45366457/can-i-use-c-sharp-code-to-add-a-call-to-a-command-instead-of -ए-ग्रिड-जेस्टरेरेको आप और क्या देख रहे हैं? –

+0

हाय @ समंथा जे! क्या आप व्यूसेल क्लास के लिए सी # कोड-पीछे साझा कर सकते हैं? –

+0

मैंने पहले से ही सभी कोड –

उत्तर

2

(गरीब अंग्रेजी के लिए क्षमा करें) में मदद मिलेगी सबसे अच्छा अभ्यास नहीं होने के बावजूद, मुझे लगता है कि आप इस तरह से कुछ कर सकते हैं, viewmodel खारिज:

XAML:

<ViewCell x:Name="ati" Tapped="OpenPickerCommand"> 
    <Grid VerticalOptions="CenterAndExpand" Padding="20, 0"> 
     <local:LabelBodyRendererClass Text="Answer Time Interval" HorizontalOptions="StartAndExpand" /> 
     <Picker x:Name="atiPicker" 
       IsVisible="false" 
       HorizontalOptions="End" 
       SelectedIndexChanged="atiPickerSelectedIndexChanged" 
       ItemsSource="{Binding Times}"> 
     </Picker> 
     <local:LabelBodyRendererClass x:Name="atiLabel" HorizontalOptions="End"/> 
    </Grid> 
</ViewCell> 

<ViewCell x:Name="pti" Tapped="OpenPickerCommand"> 
    <Grid VerticalOptions="CenterAndExpand" Padding="20, 0"> 
     <local:LabelBodyRendererClass Text="Phrase Time Interval" HorizontalOptions="StartAndExpand" /> 
     <Picker x:Name="ptiPicker" IsVisible="false" HorizontalOptions="End" SelectedIndexChanged="ptiPickerSelectedIndexChanged" ItemsSource="{Binding Times}"></Picker> 
     <local:LabelBodyRendererClass x:Name="ptiLabel" HorizontalOptions="End"/> 
    </Grid> 
</ViewCell> 

सी #:

private void OpenPickerCommand(object sender, System.EventArgs e) 
{ 
    if (sender != null) 
    { 
     Picker pkr = sender == ati ? atiPicker : ptiPicker; 
     pkr.Focus(); 
    } 
} 

अपने प्रश्न का उत्तर देना "दृश्य मॉडल एक विधि है कि एक तर्क? लेता है हो सकता है", यह वास्तव में है क्या आप पहले से ही 'OpenPickerCommand' पद्धति का उपयोग करके कर रहे हैं। समस्या यह है कि व्यूसेल की सार्वजनिक घटना 'टैप' का उपयोग करके, आप प्रतिनिधि हैंडलर को पैरामीटर सेट नहीं कर सकते हैं।

मुझे बताएं कि यह आपके लिए काम करता है या आपको कुछ और जानकारी चाहिए।

मुझे उम्मीद है कि यह मदद करता है।

1
  • पहली समस्या यह है कि आप कोड-बैक और एमवीवीएम उसी कोड में दृष्टिकोण जोड़ रहे हैं। यह भ्रमित है और निश्चित रूप से कोड को सही तरीके से कोड करने के लिए नहीं है जिसे आप प्राप्त करना चाहते हैं। इसलिए, सभी कमांडिंग दृश्य से जुड़े व्यूमोडेल में होनी चाहिए, कुछ कोड के अलावा कोई कोड-पीछे केवल यूआई प्रभावों के लिए उपयोग नहीं किया गया है।
    • सभी दृश्य वस्तुओं के लिए एक इशारा पहचानकर्ता को परिभाषित करने की आवश्यकता नहीं है क्योंकि आप केवल दृश्यसेल की सभी सतहों पर टैप का पता लगाना चाहते हैं। इसे प्राप्त करने के लिए आपको ViewTransparent = true के साथ व्यूसेल के सभी बच्चों को परिभाषित करना होगा। तो टैप का पता नहीं लगाया जाएगा और माता-पिता व्यूसेल द्वारा फंस जाएगा (आप को इंस्पू ट्रांसपेरेंट को इंगित करना चाहिए क्योंकि X.Forms में कोई टैप ईवेंट बबलिंग नहीं है)।
    • पिकर को दिखाना और मजाक करना एक दृश्य समस्या है जो ViewModel नहीं है। तो यहां आप व्यूसेल टैप किए गए ईवेंट के लिए इवेंट हैंडलर बनाने के लिए कुछ कोड-बैक का उपयोग कर सकते हैं। यह हैंडलर केवल पिकर पर दृश्य = सत्य सेट करेगा।
    • पिकर चयनित ईवेंट ViewModel में संबंधित कमांड से जुड़ा होना चाहिए। इसलिए प्रत्येक बार जब पिकर प्रदर्शित होता है और एक मूल्य चुना जाता है तो आपका व्यूमोडेल कार्रवाई के बारे में अवगत होगा। यह एकमात्र कमांड है जिसे आपको अपने व्यूमोडेल में चाहिए। XForms संस्करण के आधार पर पिकर के पास कोई बाध्यकारी कमांड नहीं है, इसलिए आप वेब पर कई "बाइंडेबलपिकर" कार्यान्वयन का उपयोग कर सकते हैं या आप XAML EventToCommand व्यवहार का भी उपयोग कर सकते हैं।

तो वहाँ दो अलग-अलग समस्याओं है: दिखा/hidding पिकर जो सीधे XAML में या का कोड-पीछे एक सा की मदद से प्राप्त किया जा सकता; और पिकर आइटम चयन जिसे व्यूमोडेल में कमांड का उपयोग करके प्रबंधित किया जाना चाहिए।

आशा यह आप

+0

धन्यवाद ओलिवियर साझा किया है, क्या आप मेरे ऐप के लिए मेरे पास मौजूद कोड का उपयोग करके इसका क्या मतलब दे सकते हैं? – Alan2

+0

सामंथा यहां एक पूर्ण नमूना है। – Olivier

+0

GIF को डाउनलोड करने के लिए लिंक जो प्रभाव दिखाता है:! [SamDemo.Gif] (http://www.e-naxos.com/download/samdemo.gif) – Olivier

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

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