在集合视图项目的 Xamarin 表单中,如何根据项目的值设置按钮? (条件装箱)

in Xamarin form for collection view items how to set button base on item's value? (conditional binfing)

我正在做一个 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”字段,用于定义任务是否在有价值时完成。

有两种解决方法:

  1. 创建一个布尔变量来检查视图模型中的 CompletedDate 并将文本绑定到它。然后使用转换器将布尔值转换为字符串。关于clicked事件,你可以尝试和Text做同样的事情或者在page.cs.
  2. 中的click事件中做检查
  3. 也在视图模型中创建一个布尔变量,但是您需要在 xaml 和绑定中创建两个按钮(一个是“标记为已完成”,另一个是“标记为已完成”)他们的 IsVisible 属性 到视图模型中的布尔变量。

我建议你尝试第二种解决方案,因为第一种需要做很多事情并将点击事件转换为命令。而第二个减少了很多工作。

最后,您可以尝试使用一些其他控件来代替按钮。如:

复选框:https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/checkbox

切换:https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/switch

编辑:

在视图模型中:

 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}/>

也可以像Ibrennan208说的那样使用DataTrigger,然后查看page.cs:

中的Text值
     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>

您可以尝试将 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 变量添加通知。

设置 CompletedDate 时调用 OnPropertyChanged(nameof(IsCompleted)) 即可。