Метка изменения форм Xamarin из CollectionView в EventHandler - PullRequest
1 голос
/ 31 января 2020

У меня проблема. Я создал CollectionView с меткой в ​​качестве счетчика на каждой строке и кнопкой. Я хочу, чтобы, когда я нажимал кнопку sh, значение метки go увеличивалось на +1, в зависимости от строки, которую вы щелкаете. Я уже создал событие кнопки следующим образом:

private void btnPlus_Clicked(object sender, EventArgs e)
{
    int currentValue = Convert.ToInt32(txtCounter.Text);
    txtCounter.Text = (currentValue + 1).ToString();
}

А вот мой xaml:

<CollectionView ItemsSource="{Binding imageList}">
    <CollectionView.ItemsLayout>
        <GridItemsLayout Orientation="Vertical" />
    </CollectionView.ItemsLayout>
    <CollectionView.ItemTemplate>
        <DataTemplate>
            <StackLayout HorizontalOptions="Center" 
                <Label Text="1" TextColor="Black" x:Name="txtCounter" FontAttributes="Bold" VerticalOptions="Center"/>
                <Button CornerRadius="13" WidthRequest="25" Text="+" Padding="0"
                        HeightRequest="25" VerticalOptions="Center" Clicked="btnPlus_Clicked" />
            </StackLayout>
        </DataTemplate>
    </CollectionView.ItemTemplate>
</CollectionView>

Но txtCounter не распознается!?

Что я делаю не так?

Ответы [ 2 ]

3 голосов
/ 31 января 2020

Поскольку вы использовали MVVM, вам лучше обработать логику c в ViewModel.

в Xaml

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:d="http://xamarin.com/schemas/2014/forms/design"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             mc:Ignorable="d"
             x:Name="MyPage"  //set name of content page
             x:Class="xxx.MainPage">
<StackLayout HorizontalOptions="Center" 
      <Label Text="{Binding Count}" TextColor="Black" x:Name="txtCounter" FontAttributes="Bold" VerticalOptions="Center"/>
      <Button CornerRadius="13" WidthRequest="25" Text="+" Padding="0" HeightRequest="25" VerticalOptions="Center" Command="{Binding AddCommand}" CommandParameter="{Binding }"/>
</StackLayout>

в модели

public class MyImage : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }

        private string count ;
        public string Count
        {
            set
            {
                if (count != value)
                {
                    count = value;
                    NotifyPropertyChanged("Count");
                }
            }
            get { return count; }
        }
    }

  // ... other property

в ViewModel

public VM_CounterList()
{

   imageList= new ObservableCollection<MyImage>() {

     new MyImage(){Count="0" },
     new MyImage(){Count="0" },
     new MyImage(){Count="0" },
     new MyImage(){Count="0" },
     new MyImage(){Count="0" },
     new MyImage(){Count="0" },

   };

   AddCommand = new Command((obj)=> {

      var myimage = obj as MyImage;

      int currentValue = Convert.ToInt32(myimage.Count);
      myimage.Count = (currentValue + 1).ToString();

   });
}
0 голосов
/ 31 января 2020

x: имя не в контексте того, что вы хотите. Чтобы связать свойство из шаблона с чем-либо в коде возврата XAML.cs, используйте:

PropertyOnTemplate="{Binding Path=NameOfProperty, Source={x:Reference Name=NameOfFile}}

Затем, когда вы обновляете свойство NameOfProperty, пользовательский интерфейс будет обновляться соответственно

Поскольку у вас есть список, сохраните список счетчиков, чтобы вы могли обновить правильный счетчик, проиндексированный выбранным элементом из списка

...