Xamarin Forms - Изменить значение CheckBox, когда другой CheckBox изменился внутри ListView - PullRequest
1 голос
/ 28 октября 2019

У меня есть ListView с привязкой ItemSource к объекту списка;внутри списка есть несколько элементов, которые заполнены значениями объекта списка. У меня есть 2 флажка, которые привязываются к элементам объекта списка и хотят снять один, когда проверяется другой. В написанном мною коде значения правильно изменены в объекте списка, но флажок не изменился (не проверяйте). Далее приведен код, который я написал.

Часть XAML

            <ListView ItemsSource="{Binding ListaAsistencia}" HasUnevenRows="True" SelectionMode="None" x:Name="AsistList">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <Frame Margin="5,2,5,2" Padding="0" BackgroundColor="Transparent" BorderColor="#915c0d">
                            <Grid>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width=".7*"></ColumnDefinition>
                                    <ColumnDefinition Width=".3*"></ColumnDefinition>
                                </Grid.ColumnDefinitions>
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="Auto"></RowDefinition>
                                    <RowDefinition Height="Auto"></RowDefinition>
                                </Grid.RowDefinitions>
                                <Label Text="{Binding alumno, Mode=TwoWay}" Grid.Row="0" Grid.Column="0" FontSize="Micro" Margin="5,2,2,2"/>
                                <Entry Placeholder="Notas" Text="{Binding notas}" Grid.Row="1" Grid.Column="0" FontSize="Micro" TextColor="Black" />
                                <Grid Grid.Row="0" Grid.Column="1">
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width=".65*"></ColumnDefinition>
                                        <ColumnDefinition Width=".35*"></ColumnDefinition>
                                    </Grid.ColumnDefinitions>
                                    <Label Text="Asistió" Grid.Column="0" HorizontalOptions="End" FontSize="Micro" VerticalOptions="Center"/>
                                    <CheckBox IsChecked="{Binding asistencia, Mode=TwoWay}" Grid.Column="1" HorizontalOptions="Start" Color="Black"/>
                                </Grid>
                                <Grid Grid.Row="1" Grid.Column="1">
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width=".65*"></ColumnDefinition>
                                        <ColumnDefinition Width=".35*"></ColumnDefinition>
                                    </Grid.ColumnDefinitions>
                                    <Label Text="F. Just." Grid.Column="0" FontSize="Micro" HorizontalOptions="End" VerticalOptions="Center"/>
                                    <CheckBox IsChecked="{Binding falta_justificada, Mode=TwoWay}" Grid.Column="1" HorizontalOptions="Start" Color="DarkBlue" CheckedChanged="CheckBox_Just_CheckedChanged"  AutomationId="{Binding idalumno_grupo}"/>
                                </Grid>
                            </Grid>
                        </Frame>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>

C # BackEnd Part

    private void CheckBox_Just_CheckedChanged(object sender, CheckedChangedEventArgs e)
    {
        var vm = BindingContext as AsisCapturarViewModel;
        if ((e.Value) && (!vm.obtainingData))
        {
            CheckBox switchBox = (CheckBox)sender;
            vm.UncheckFalta(switchBox.AutomationId);
        }
    }

C # Просмотр модели модели

    public async void UncheckFalta(string idalumno_grupo)
    {
        if (!String.IsNullOrEmpty(idalumno_grupo))
        {
            int idalumno_grupoUse = Convert.ToInt32(idalumno_grupo);
            ListaAsistencia.Where(a => a.idalumno_grupo == idalumno_grupoUse).ToList().ForEach(s => s.asistencia = false);
        }
    }

Класс, используемый в списке

public class AsistenciaList
{
    public int idasistencia { get; set; }
    public DateTime fecha { get; set; }
    public int idtipo_evento { get; set; }
    public string tipo_evento { get; set; }
    public int idmaestro_grupo { get; set; }
    public int idalumno_grupo { get; set; }
    public string alumno { get; set; }
    public bool asistencia { get; set; }
    public string notas { get; set; }
    public bool falta_justificada { get; set; }
}

Спасибо за вашу помощь.

1 Ответ

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

Во-первых, согласитесь с Джейсоном. Вам следует реализовать интерфейс INotifyPropertyChanged в вашей модели, если вы хотите обновить пользовательский интерфейс во время выполнения.

Кроме того, поскольку вы использовали MVVM, вам следуетпоместите всю логику в вашу модель представления.

Таким образом, вы можете улучшить свой код следующим образом

в вашей модели

public class AsistenciaList:INotifyPropertyChanged
{

    public event PropertyChangedEventHandler PropertyChanged;

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


    public int idasistencia { get; set; }
    public DateTime fecha { get; set; }
    public int idtipo_evento { get; set; }
    public string tipo_evento { get; set; }
    public int idmaestro_grupo { get; set; }
    public int idalumno_grupo { get; set; }
    public string alumno { get; set; }

    public string notas { get; set; }


    private bool asis;
    public bool asistencia
    {
        get
        {
            return asis;
        }

        set
        {
            if (asis != value)
            {
                asis = value;
                NotifyPropertyChanged();
            }
        }
    }

    private bool falta;
    public bool falta_justificada
    {
        get
        {
            return falta;
        }

        set
        {
            if (falta != value)
            {
                falta = value;
                NotifyPropertyChanged();
            }
        }
    }
}

xaml

<CheckBox IsChecked="{Binding falta_justificada, Mode=TwoWay}" Grid.Column="1" HorizontalOptions="Start" Color="DarkBlue" AutomationId="{Binding idalumno_grupo}"/>

ViewModel

//...
foreach(AsistenciaList asistencia in ListaAsistencia)
{
   asistencia.PropertyChanged += Asistencia_PropertyChanged;
}
//...
private void Asistencia_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
   if(e.PropertyName== "falta_justificada")
   {
     AsistenciaList asistencia = sender as AsistenciaList;

     var idalumno_grupo = asistencia.idalumno_grupo;

     //...do something you want
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...