Как удалить выполнение метода из ViewModel - Xamarin.Forms - MVVM - PullRequest
1 голос
/ 28 октября 2019

У меня есть <List>, который добавляет и удаляет элементы, вызывая модальное значение из <Button>, как показано на рисунке.

List

При поднятии модальных я показываю пользователю элементы, которые могут быть связаны с основным списком, а также с помощью <Switch> указывает, добавлены ли эти элементы или нет, с целью, чтобы при нажатии переключателя добавлять или удалять элементы из основногоlist

Modal

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

Duplicated

Это связано с тем фактом, что при поднятии модальноговыполняется удаление химикатов, это вызывается каждый раз, когда значение свойства, связанное с <Switch> в представлении, изменяется

Почему это происходит? Как я могу избежать этого?

Затем я представляю свой код ...

MODAL.XAML:

<StackLayout           
            BindingContext="{Binding AgregarSustancia}">

      <ListView
                    ItemsSource="{Binding ListaSustancias}"
                    SelectedItem="{Binding SelectedSustancia}">                      
                     <ListView.ItemTemplate>
                        <DataTemplate>
                            <ViewCell>
                                <StackLayout>

                                    <StackLayout Orientation="Vertical">

                                          <Label Text="{Binding NombreSustancia}"   
                                                   HorizontalOptions="FillAndExpand"   
                                                  VerticalOptions="CenterAndExpand"/>

                                    </StackLayout>

                                            <Switch
                                               OnColor="{StaticResource das.color.verde}"              HorizontalOptions="EndAndExpand"
                                               VerticalOptions="Start"
                                               IsToggled="{Binding SustanciaAsociada, Mode=OneWay}">
                                           </Switch>

                                </StackLayout>
                            </ViewCell>
                        </DataTemplate>
                    </ListView.ItemTemplate>
                </ListView>

<StackLayout/>

AGREGARSUSTANCIA.CS:

     bool sustanciaAsociada;

     [JsonProperty(PropertyName = "chemicalIsAssociateWithInstallation")]
            public bool SustanciaAsociada
            {

                get
                {
                    return sustanciaAsociada;
                }

                set
                {
                    if (value != sustanciaAsociada)
                    {
                        sustanciaAsociada = value;

                        AsociarDesasociar(sustanciaAsociada);
                    }
                }
            }

//METHOD THAT ADDS OR ELIMINATES DEPENDING ON THE VALUE OF THE PARAMETER
  private async void AsociarDesasociar(bool sustanciaAsociada)
        {                      

            //ADD TO LIST
            if (sustanciaAsociada)
            {

            }

            else //REMOVE TO LIST
            {


            }
        }

Тогда мой ViewModel, заполняющий модальный список

VIEWMODEL.CS: (MODAL)

  #region Constructor
        public AgregarSustanciaViewModel(ObservableCollection<AgregarSustancia> listaAgregarSustancia)
        {
            navigationService = new NavigationService();

            ListaSustancias = new ObservableCollection<AgregarSustancia>();

            listaSustanciasAux = new List<AgregarSustancia>(listaAgregarSustancia);

            ListaSustancias = listaAgregarSustancia;

        }
        #endregion

Как я могу предотвратить метод AsociarDesasociar() в свойстве Get-Set коммутатораот выполнения модального? Как я могу инкапсулировать этот метод? Любая помощь для меня?

1 Ответ

1 голос
/ 29 октября 2019

создайте bool InitComplete и инициализируйте его false. Это предотвратит выполнение AsociarDesasociar до завершения инициализации

if (value != sustanciaAsociada)
{
  sustanciaAsociada = value;

  if (InitComplete) {
    AsociarDesasociar(sustanciaAsociada);
  }
}

после того, как ваш класс завершит любую инициализацию, затем установите InitComplete = true

...