В форме Xamarin для элементов представления коллекции, как установить кнопку на основе значения элемента? (условный бинфинг)

Я делаю проект формы Xamarin, у меня есть список задач, которые можно выполнить или завершить. Я хочу добавить кнопку для отображения «Отметить как завершенную» для завершенных задач и «Отметить как завершенную» для завершенных задач. конечно, он должен обновляться, когда пользователь щелкает один раз. У меня есть поле «CompletedDate», которое определяет, завершена ли задача, когда она имеет значение.

  TextColor = "{StaticResource PrimaryBlack}" />
                            <CollectionView  Grid.Row = "1" ItemsSource = "{Binding Tasks}" x:Name = "List3">
                                <CollectionView.ItemTemplate>
                                    <DataTemplate>
                                        <Grid>
                                            <Frame
                                        Margin = "0,10"
                                        Padding = "10"
                                        BackgroundColor = "{StaticResource PrimaryWhite}"
                                        BorderColor = "{StaticResource PrimaryLightGray}"
                                        CornerRadius = "10"
                                        HasShadow = "False">
                                                <Grid RowDefinitions = "Auto,Auto,Auto,Auto,Auto,Auto" RowSpacing = "15">
                                                    <StackLayout Orientation = "Horizontal">
                                                        <Label
                                                    FontFamily = "{StaticResource MeduimFont}"
                                                    Style = "{StaticResource LabelMedium}"
                                                    Text = "Completed"
                                                          IsVisible = "{Binding CompletedTaskVisibility}}"
                                                    TextColor = "{Binding PrimaryPersianGreen}" />
                                                        <StackLayout HorizontalOptions = "EndAndExpand" Orientation = "Horizontal">
                                                            <Image
                                                        HeightRequest = "20"
                                                        Source = "iconCalender.png"
                                                        WidthRequest = "20" />
                                                            <Label
                                                        FontFamily = "{StaticResource MeduimFont}"
                                                        Style = "{StaticResource LabelMedium}"
                                                        Text = "{Binding CompletedDate,StringFormat='{0:MMMM dd, yyyy}'}"
                                                        TextColor = "{StaticResource PrimaryBlack}" 
                                                        />
                                                        </StackLayout>
                                                    </StackLayout>

                                                    <BoxView
                                                Grid.Row = "1"
                                                HeightRequest = "1"
                                                Color = "{StaticResource PrimaryLightGray}" />

                                                    <Label
                                                Grid.Row = "2"
                                                Style = "{StaticResource LabelMedium}"
                                                Text = "{Binding Name}"
                                                TextColor = "{StaticResource PrimaryBlack}" />
                                                    <Label
                                                Grid.Row = "3"
                                                Style = "{StaticResource LabelMedium}"
                                                Text = "{Binding Description}"
                                                TextColor = "{StaticResource PrimaryBlack}" />


                                                    <Button
                                                x:Name = "lstbtnMarkasComplite"
                                                Grid.Row = "5"
                                                Padding = "15,0"
                                                Clicked = "MarkTaskAsCompletedClicked"
                                                CornerRadius = "20"
                                                FontSize = "{StaticResource Font12}"
                                                HeightRequest = "40"
                                                         CommandParameter = "{Binding Id}"
                                                HorizontalOptions = "CenterAndExpand"
                                                Style = "{StaticResource ButtonPurple}"
                                                Text = "Mark as Completed" />
                                                  
                                                </Grid>
                                            </Frame>
                                        </Grid>
                                    </DataTemplate>
                                </CollectionView.ItemTemplate>
                            </CollectionView>

У меня есть поле «CompletedDate», которое определяет, завершена ли задача, когда она имеет значение.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
59
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Есть два решения:

  1. Создайте логическую переменную, которая проверяет CompletedDate в вашей модели представления и привязывает к ней текст. А затем используйте конвертер, чтобы преобразовать логическое значение в строку. Что касается события click, вы можете попробовать сделать то же самое, что и Text, или выполнить проверку события click в page.cs.
  2. Создайте логическую переменную и в модели представления, но вам нужно создать две кнопки (одна — «Пометить как выполненную», а другая — «Пометить как завершенную») в xaml и привязать их свойство IsVisible к логической переменной в просмотреть модель.

Я предлагаю вам попробовать второе решение, потому что первое нужно сделать много и преобразовать событие clicked в команду. И второй уменьшает много работы.

Наконец, вы можете попробовать использовать другие элементы управления вместо кнопки. Такие как:

Флажок:https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/checkbox

Переключатель:https://docs.microsoft.com/en-us/xamarin/xamarin-forms/пользовательский интерфейс/переключатель

Редактировать:

в модели представления:

 public ViewModel()
    {
        CompletedDate = ""; //set the value with the model data
        if (CompletedDate != null)
        {
            isCompleted = true;
        }
        else isCompleted = false;
 }

 public event PropertyChangedEventHandler PropertyChanged;

    bool isCompleted;
    public bool IsCompleted { 
        get { return isCompleted; } 
        set { 
              isCompleted = value;
              if (PropertyChanged != null)
              {
                  PropertyChanged(this, new PropertyChangedEventArgs("IsCompleted"));
              }
            }
    }

в xaml:

 <Button
                                            x:Name = "lstbtnMarkasComplite"
                                            Grid.Row = "5"
                                            Padding = "15,0"
                                            Clicked = "MarkTaskAsCompletedClicked"
                                            CornerRadius = "20"
                                            FontSize = "{StaticResource Font12}"
                                            HeightRequest = "40"
                                                     CommandParameter = "{Binding Id}"
                                            HorizontalOptions = "CenterAndExpand"
                                            Style = "{StaticResource ButtonPurple}"
                                            Text = "Mark as Completed" 
                                            IsVisible = "{Binding IsCompleted}"/>

 <Button
                                            x:Name = "lstbtnMarkasComplite"
                                            Grid.Row = "5"
                                            Padding = "15,0"
                                            Clicked = "MarkTaskAsInCompletedClicked"
                                            CornerRadius = "20"
                                            FontSize = "{StaticResource Font12}"
                                            HeightRequest = "40"
                                                     CommandParameter = "{Binding Id}"
                                            HorizontalOptions = "CenterAndExpand"
                                            Style = "{StaticResource ButtonPurple}"
                                            Text = "Mark as in Completed" 
                                            IsVisible = "{Binding IsCompleted}/>

Вы также можете использовать DataTrigger, как сказал Ibrennan208, а затем проверить значение Text в page.cs:

     private async void Button_Clicked(object sender, EventArgs e) 
     {
        Button button = sender as Button;
        if (button.Text == "Mark as Completed")
        {
            .........
        }
        else
        {
            .........
        }
     }

Обновлять:

<Button.Triggers>
     <DataTrigger TargetType = "Button" Binding = "{Binding CompletedDate}" Value = "{x:Null}">
        <Setter Property = "Text" Value = "Mark Task as Completed"/>
     </DataTrigger>
</Button.Triggers>

Спасибо за ответ, но как я могу привязать логическое значение к элементам представления коллекции? Можете ли вы привести пример?

Mah 11.05.2022 08:52

Вы можете проверить отредактированный ответ. @Mah

Liyun Zhang - MSFT 11.05.2022 09:05

Вы можете установить значение IsCompleted в методе Construction модели представления. Пожалуйста, проверьте код в модели представления в ответе. @Ма

Liyun Zhang - MSFT 11.05.2022 10:13

так завершен только один? Правильно? У меня есть список задач, как я могу привязать его к дате выполнения нескольких задач?

Mah 12.05.2022 02:22

Это не только один. Это похоже на CompletedDate в модели представления, разные элементы имеют разное значение iscompleted. Таким образом, кнопка в элементе зависит от значения iscompleted, которое зависит от значения CompletedDate, указанного в каждом элементе. @Ма

Liyun Zhang - MSFT 12.05.2022 02:55

в моей модели просмотра у меня есть эта строка: public ObservableCollection<ProjectTaskLineItemSummary> Tasks {get; набор; } Я объяснил больше здесь: stackoverflow.com/questions/72201437/…

Mah 12.05.2022 03:24

Извините, это моя невнимательность, для этого условия вам может понадобиться добавить переменную bool IsCompleted в модель ProjectTaskLineItemSummary. Потому что кнопка находится в элементе представления коллекции, а элемент должен привязывать свойство в модели. И затем вы можете установить значение IsCompleted для ProjectTaskLineItemSummary в методе построения модели представления или просто установить его при установке значения модели. @Ма

Liyun Zhang - MSFT 12.05.2022 04:10

Или вы можете попытаться напрямую привязать его к CompletedDate, пожалуйста, проверьте обновление в моем ответе. @Mah

Liyun Zhang - MSFT 12.05.2022 04:22

Я думаю, что это будет отличное решение, вы можете попробовать, и я рад получить ваш ответ. @Ма

Liyun Zhang - MSFT 12.05.2022 04:32

Вы можете попробовать добавить DataTrigger в свой Button. Их можно использовать для применения условных привязок или значений к таким свойствам, как свойство Button.Text.

Для кнопки вы можете реализовать ее аналогично следующему:

    <Button Test = "Mark Complete">
        <Button.Triggers>
            <DataTrigger TargetType = "Button" Binding = "{Binding IsCompleted}" Value = "True">
                <Setter Property = "Text" Value = "Mark Incomplete"/>
            </DataTrigger>
        </Button.Triggers>
    </Button>

Затем вы также можете добавить поле IsCompleted в свою модель представления:

public bool IsCompleted             
            get { return CompletedDate.HasValue; }
        

который будет действовать как переключатель для вашей кнопки.

Вам также необходимо добавить уведомление для переменной IsCompleted.

Вызов OnPropertyChanged(nameof(IsCompleted)) при установке CompletedDate сделает это.

Спасибо за ответ, но как я могу привязать isCompleted к свойству элемента collectionview?

Mah 11.05.2022 10:00

Другие вопросы по теме