Xamarin связывает множество текстов записей для каждого элемента массива - PullRequest
0 голосов
/ 06 августа 2020

Я программно создаю записи и программно пытаюсь привязать каждый текст записи к соответствующему элементу массива (на основе индекса). Но, похоже, это не является обязательным. Попытка реализовать mvvm. Может ли кто-нибудь помочь с этой проблемой?

Это часть просмотра:

        var saveMeasurmentViewModel = new SaveMeasurementViewModel();
        BindingContext = saveMeasurmentViewModel;

        var radius = Convert.ToInt32(DeviceDisplay.MainDisplayInfo.Width * 0.32);
        var entryList = new List<Entry>();
        for (int index = 0; index < 18; index++)
        {
            var entry = new Entry
            {
                Placeholder = (index + 1).ToString(),
                TabIndex = index + 1,
            };
            object actualValueForBinding = saveMeasurmentViewModel.ActualValues[index];
            entry.SetBinding(Entry.TextProperty, nameof(actualValueForBinding));
            var frame = new Frame
            {
                Content = entry,
                Margin = new Thickness(Math.Sin(20 * index * Math.PI / 180) * radius, 0, 0, Math.Cos(20 * index * Math.PI / 180) * radius),
            };
            entryList.Add(entry);
            MainGrid.Children.Add(frame, 0, 2, 0, 1);
        }

Свойство ViewModel, которое я пытаюсь привязать:

    public double[] ActualValues
    {
        get { return actualValues; }
        set
        {
            actualValues = value;
            OnPropertyChanged();
        }
    }

1 Ответ

0 голосов
/ 06 августа 2020

В вашем случае вы не можете напрямую привязать текст записи к списку. Было бы лучше использовать BindableLayout

в xaml

<ScrollView Orientation="Both">
        <StackLayout  BindableLayout.ItemsSource="{Binding ActualValues}" x:Name="MainGrid" HorizontalOptions="Center"
           VerticalOptions="CenterAndExpand">
            <!-- Place new controls here -->

            <BindableLayout.ItemTemplate>
                <DataTemplate>
                    <Grid>

                        <Grid.RowDefinitions>

                            <RowDefinition Height="Auto"  />

                        </Grid.RowDefinitions>
                                               <!--Margin="{Binding Margin}"  you can also set margin with data-binding   --> 
                        <Frame  Grid.Row="0"  Margin="10,10"  WidthRequest="90" HeightRequest="50" BackgroundColor="LightBlue">

                            <Entry TabIndex="{Binding Id}" Text="{Binding Value}" WidthRequest="80" HeightRequest="30" TextColor="Red" />

                        </Frame>

                    </Grid>
                </DataTemplate>
            </BindableLayout.ItemTemplate>

        </StackLayout>
    </ScrollView>

в Viewmodel

public class MyModel:INotifyPropertyChanged
{

    public MyModel(int id)
    {

        Value = "entry" + id.ToString(); 
        Id = id;

        var radius = Convert.ToInt32(DeviceDisplay.MainDisplayInfo.Width * 0.32);

      //  Margin = new Thickness(Math.Sin(20 * id * Math.PI / 180) * radius, 0, 0, Math.Cos(20 * id * Math.PI / 180) * radius);

    }

    public event PropertyChangedEventHandler PropertyChanged;

    public Thickness Margin { get; set; }

    public int Id { get; set; }

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    string _value;

    public string Value
    {

        get
        {
            return _value;
        }

        set
        {
            if (value != _value)
            {
                _value = value;
                OnPropertyChanged("Value");
            }
        }
    }

}

public class SaveMeasurementViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

  
    public ObservableCollection<MyModel> ActualValues { get;set; }

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    public SaveMeasurementViewModel()
    {
        ActualValues = new ObservableCollection<MyModel>() { };

        for (int index = 0; index < 18; index++)
        {
            ActualValues.Add(new MyModel(index) );
        }

    }

}

Для получения дополнительной информации вы можете проверить https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/layouts/bindable-layouts

введите описание изображения здесь

...