इस सवाल का विभिन्न समाधान कर रहे हैं। एक को चुनने से पहले उनमें से सभी के माध्यम से पढ़ लें - मेरी पसंदीदा (सरलतम एक) सभी तरह नीचे सूचीबद्ध है ...
कार्य # 1:
के रूप में कई लोगों ने सुझाव दिया है, आप कर सकते हैं
public class MyViewModel()
{
public ObservableCollection<int> Items { get; set; } = new ObservableCollection<int>();
}
private MyViewModel _viewModel = new MyViewModel();
public MainPage()
{
InitializeComponent();
BindingContext = _viewModel;
}
correctButton.Clicked += (sender, e) =>
{
App.DB.IncrementScore();
_viewModel.Items.Add(0);
};
: कुछ संग्रह नियंत्रण (मुझे लगता है कि एक पल में करने के लिए आया हूँ), एक ViewModel के भीतर एक
ObservableCollection
परिभाषित करते हैं, पृष्ठ के
Binding Context
कि ViewModel का एक उदाहरण के लिए सेट, और बटन पर क्लिक संग्रह में आइटम जोड़ने बनाने
ObservableCollection
एसी का प्रकार tually कोई प्रभाव नहीं पड़ेगा, क्योंकि हम सभी वस्तुओं के लिए एक ही स्थिर ItemTemplate
उपयोग कर रहे हैं:
<ContentPage.Resources>
<DataTemplate x:Key="ScoreItemTemplate">
<ViewCell>
<ViewCell.View>
<Label Text="{x:Static local:FontAwesome.FACheck}" FontFamily="FontAwesome" TextColor="Green"/>
</ViewCell.View>
</ViewCell>
</DataTemplate>
</ContentPage.Resources>
इस दृष्टिकोण के साथ मुख्य समस्या यह है कि Xamarin.Forms ListView
अपने आइटम क्षैतिज प्रदर्शित नहीं कर सकता है। इसका मतलब यह है, तुम वहाँ बाहर उपलब्ध HorizontalListView
Nuget संकुल में से एक डाउनलोड करें, या built-in (only in Xamarin.Forms 2.3 and above!) CarouselView
उपयोग करने की आवश्यकता होगी: के माध्यम से स्वाइप के लिए सभी दृश्य प्रभावों को दूर करने के लिए कुछ समय बिताने के लिए, आप चाहें तो कर सकते हैं करेंगे तो
<CarouselView ItemTemplate="{StaticResource ScoreItemTemplate}" ItemsSource="{Binding Items}"/>
कैरोसेल, और आइटम चुनने के लिए यदि आप एक क्षैतिज ListView का उपयोग करना चुनते हैं ...
कार्य # 2:
इसके बजाय, वहाँ दो वैकल्पिक समाधान है कि कम प्रयास करना शामिल होता है
जाहिर है, सरल दृष्टिकोण कोड में "टेम्पलेट" लेबल बनाने के लिए होगा:
<StackLayout Orientation="Horizontal" x:Name="LabelStack"/>
:
private Label CreateScoreLabel()
{
return new Label {Text = FontAwesome.FACheck, TextColor = Color.Green, FontFamily = "FontAwesome"};
}
... पृष्ठ पर एक क्षैतिज StackLayout
जोड़ने
... और नए लेबल मुश्किल तरीके से जोड़ें:
correctButton.Clicked += (sender, e) =>
{
App.DB.IncrementScore();
LabelStack.Children.Add(CreateScoreLabel());
};
बहरहाल, यह सब नहीं बल्कि सिर्फ हरे चेक अंक की एक सूची बनाने के लिए hacky लगता है। यह करने के लिए हमें ले जाता है ...
... दृष्टिकोण # 3:
तकनीकी तौर पर, यह नहीं वास्तव में आप के लिए क्या पूछा (वेतन वृद्धि लेबल की संख्या), लेकिन अपनी स्क्रीन के अनुसार शॉट यह आपकी आवश्यकताओं को एक बहुत ही सरल तरीके से पूरा कर सकता है।
मौजूदा लेबल का पाठ निकालें (के रूप में यह स्टार्टअप पर कुछ भी नहीं प्रदर्शित करेगा), और बजाय इसे एक अनन्य नाम देना:
<Label x:Name="ScoreLabel" FontFamily="FontAwesome" TextColor="Green"/>
अब, string
प्रकार है कि किसी दिए गए स्ट्रिंग को दोहराता के लिए एक सरल विस्तार विधि को परिभाषित समय की एक निश्चित संख्या के लिए:
public static class StringExtensions
{
public static string Repeat(this string input, int num)
{
return String.Concat(Enumerable.Repeat(input, num));
}
}
(इस दोहराने समारोह संभव के रूप में performant बनाने के लिए कई तरीके हैं, मैं बस सरलतम एक लाइनर उपलब्ध चुना है, खोज स्टेडियम विस्तृत विचार विमर्श के लिए ckOverflow ...)
अब आप एक Label
नियंत्रण XAML में परिभाषित के साथ काम कर सकते हैं, और सिर्फ बटन पर क्लिक इसे करने के लिए कई चेक मार्क आवंटित:
correctButton.Clicked += (sender, e) =>
{
App.DB.IncrementScore();
ScoreLabel.Text = FontAwesome.FACheck.Repeat(App.DB.Score); // replace parameter by whatever method allows you to access the current score number
};
बेशक
, इस दृष्टिकोण कर सकते हैं लेबल की Text
विशेषता को सीधे सेट करने के बजाय सार्वजनिक बाइंडेबल string
संपत्ति का उपयोग करके एमएमवीएम तरीके का पालन करने के लिए भी अनुकूलित किया जा सकता है, लेकिन इसके लिए मैं आपको सलाह देता हूं कि आप एक शुरुआती एमवीवीएम ट्यूटोरियल को देखें।
मैं दृढ़ता से इस एप्लिकेशन के लिए एक MVVM वास्तुकला में देख सिफारिश करेंगे। आप अपने लेबल को अपने ViewMidel में 'ObservableCollection' पर बाध्य कर सकते हैं। –
@RobLyndon धन्यवाद।मैं एमवीवीएम के बारे में जानता हूं लेकिन मुझे नहीं पता कि इसे यहां कैसे लागू किया जाए। क्या आप मुझे मेरे मुद्दे से संबंधित कुछ कोड नमूना दे सकते हैं? –