Listview 以编程方式切换时触发开关切换事件

Listview 以编程方式切换时触发开关切换事件,listview,xamarin.forms,xamarin.android,Listview,Xamarin.forms,Xamarin.android,我有上面的listview,它有一个开关,如果labelreserved的长度为7,我有一个触发器来切换开关,但是我不希望触发Toggled事件,只有当用户单击开关时。 是否可以执行我想要的操作?您可以通过使用属性IsEnabled禁用开关并将其设置为false来防止用户切换开关 通过使用属性IsEnabled禁用开关并将其设置为false,可以防止用户切换开关 注意:这个解决方案对我来说只是一个小小的实验——因此我建议,如果你决定实施这个方案,请谨慎使用 基本上,其目的是创建一个只查看的解决方

我有上面的listview,它有一个开关,如果labelreserved的长度为7,我有一个触发器来切换开关,但是我不希望触发Toggled事件,只有当用户单击开关时。
是否可以执行我想要的操作?

您可以通过使用属性
IsEnabled
禁用开关并将其设置为false来防止用户切换开关

通过使用属性
IsEnabled
禁用开关并将其设置为false,可以防止用户切换开关

注意:这个解决方案对我来说只是一个小小的实验——因此我建议,如果你决定实施这个方案,请谨慎使用

基本上,其目的是创建一个只查看的解决方案,该解决方案能够跟踪
IsToggled
属性的设置方式-无论是通过触发器、绑定上下文还是点击操作(类似于)

假设我们有一个自定义事件,只有当用户点击开关时才会触发-这个问题应该得到解决。简单地在
开关中添加一个点击识别器似乎不起作用。我们还有两个选择:

  • 创建您自己的自定义控件,该控件提供类似于
    开关的功能,但仅在捕获点击手势时触发切换事件-强烈建议使用此选项

  • 或者,您可以使用自定义事件扩展现有的
    开关
    控件,并通过提供其自己的可绑定属性集来跟踪
    IsToggled
    属性的设置方式

  • 例如:

    <StackLayout BackgroundColor="White">
        <ListView x:Name="ListViewMenu" ItemsSource="{Binding Menus}"
              HasUnevenRows="True"
              BackgroundColor="White"
              SeparatorVisibility="None"
              VerticalOptions="FillAndExpand"
              ItemTapped="Handle_ItemTapped"
              ItemSelected="Handle_ItemSelected"
              IsGroupingEnabled = "true"
              SeparatorColor="White">
            <ListView.GroupHeaderTemplate>
                <DataTemplate>
                    <ViewCell>
                        <ViewCell.View>
                            <StackLayout BackgroundColor="LightSkyBlue" HeightRequest="25">
                                <Label Text="{Binding Key}"  FontAttributes="Bold"  LineBreakMode="NoWrap" Margin="10,0,0,0">
                                </Label>
                            </StackLayout>
                        </ViewCell.View>
                    </ViewCell>
                </DataTemplate>
            </ListView.GroupHeaderTemplate>
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <ViewCell.View>
                            <Grid>
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="Auto"></RowDefinition>
                                    <RowDefinition Height="Auto"></RowDefinition>
                                </Grid.RowDefinitions>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="6*"></ColumnDefinition>
                                    <ColumnDefinition Width="Auto"></ColumnDefinition>
                                </Grid.ColumnDefinitions>
                                <Label Text="{Binding article_description}"
                                           FontAttributes="Bold" FontSize="13"  Margin="10,5,0,-6" Grid.Row="0" LineBreakMode="NoWrap"/>
                                <Label Text="{Binding dish_name}" 
                                       FontSize="13" Margin="10,0,0,2" Grid.Row="1" Grid.Column="0"/>
                                <Label Grid.Row="0" Grid.Column="0" x:Name="LabelReserved"  Text="{Binding reserved}" IsVisible="false" LineBreakMode="NoWrap"/> 
                                <Switch Grid.Row="0" Grid.RowSpan="2" Grid.Column="1"  HorizontalOptions="Start" VerticalOptions="Center" IsEnabled="False" Toggled="SwitchMenu_OnToggled" >
                                    <Switch.Triggers>
                                        <DataTrigger TargetType="Switch" Binding="{Binding Source={x:Reference LabelReserved},
                                       Path=Text.Length}" Value="7">
                                            <Setter Property="IsToggled" Value="true" />
                                        </DataTrigger>
                                    </Switch.Triggers>
                                </Switch>
                            </Grid>
                        </ViewCell.View>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </StackLayout>
    
    公共类CustomSwitch:Switch
    {
    内部枚举切换设置标志
    {
    无=0,
    FromCode=1注意:这个解决方案对我来说是一个小小的实验——因此我建议,如果您决定实现它,请谨慎使用

    基本上,其目的是创建一个只查看的解决方案,该解决方案能够跟踪
    IsToggled
    属性的设置方式-无论是通过触发器、绑定上下文还是点击操作(类似于)

    假设我们有一个自定义事件,只有当用户点击开关时才会触发-这个问题应该得到解决。简单地向
    开关添加点击识别器似乎不起作用。我们只有两个选项:

  • 创建您自己的自定义控件,该控件提供类似于
    开关的功能,但仅在捕获点击手势时触发切换事件-强烈建议使用此选项

  • 或者,您可以使用自定义事件扩展现有的
    开关
    控件,并通过提供其自己的可绑定属性集来跟踪
    IsToggled
    属性的设置方式

  • 例如:

    <StackLayout BackgroundColor="White">
        <ListView x:Name="ListViewMenu" ItemsSource="{Binding Menus}"
              HasUnevenRows="True"
              BackgroundColor="White"
              SeparatorVisibility="None"
              VerticalOptions="FillAndExpand"
              ItemTapped="Handle_ItemTapped"
              ItemSelected="Handle_ItemSelected"
              IsGroupingEnabled = "true"
              SeparatorColor="White">
            <ListView.GroupHeaderTemplate>
                <DataTemplate>
                    <ViewCell>
                        <ViewCell.View>
                            <StackLayout BackgroundColor="LightSkyBlue" HeightRequest="25">
                                <Label Text="{Binding Key}"  FontAttributes="Bold"  LineBreakMode="NoWrap" Margin="10,0,0,0">
                                </Label>
                            </StackLayout>
                        </ViewCell.View>
                    </ViewCell>
                </DataTemplate>
            </ListView.GroupHeaderTemplate>
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <ViewCell.View>
                            <Grid>
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="Auto"></RowDefinition>
                                    <RowDefinition Height="Auto"></RowDefinition>
                                </Grid.RowDefinitions>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="6*"></ColumnDefinition>
                                    <ColumnDefinition Width="Auto"></ColumnDefinition>
                                </Grid.ColumnDefinitions>
                                <Label Text="{Binding article_description}"
                                           FontAttributes="Bold" FontSize="13"  Margin="10,5,0,-6" Grid.Row="0" LineBreakMode="NoWrap"/>
                                <Label Text="{Binding dish_name}" 
                                       FontSize="13" Margin="10,0,0,2" Grid.Row="1" Grid.Column="0"/>
                                <Label Grid.Row="0" Grid.Column="0" x:Name="LabelReserved"  Text="{Binding reserved}" IsVisible="false" LineBreakMode="NoWrap"/> 
                                <Switch Grid.Row="0" Grid.RowSpan="2" Grid.Column="1"  HorizontalOptions="Start" VerticalOptions="Center" IsEnabled="False" Toggled="SwitchMenu_OnToggled" >
                                    <Switch.Triggers>
                                        <DataTrigger TargetType="Switch" Binding="{Binding Source={x:Reference LabelReserved},
                                       Path=Text.Length}" Value="7">
                                            <Setter Property="IsToggled" Value="true" />
                                        </DataTrigger>
                                    </Switch.Triggers>
                                </Switch>
                            </Grid>
                        </ViewCell.View>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </StackLayout>
    
    公共类CustomSwitch:Switch
    {
    内部枚举切换设置标志
    {
    无=0,
    
    FromCode=1我认为不可能做您想要的事情。我会想象当
    IsToggled
    属性更改事件Fire时,我不认为可以做您想要的事情。我会想象当
    IsToggled
    属性更改我不想要的事件Fire时,每次我在页面中输入切换事件激发时,我只希望切换到切换位置和无单击事件。因为当用户单击开关时,我必须在数据库中插入数据。我会这样解决:1.忘记触发器2.您可以将IsToggled绑定到模型中的bool属性。3.模型有另一个bool属性,名为“IsToggled Programmatically”4.如果字符串长度超过7个字符,则可以将此属性设置为true。5.触发事件时,请选中“IsToggledProgrammatically”,如果是真的,则忽略。无论如何,什么样的解决方案需要根据标签文本长度进行切换?:D我不知道有什么更好的解决方案:D我将看看是否可以实现您所说的。谢谢您举个例子,模型在最初的帖子中。不需要我想要,每次我在页面中输入切换g事件触发,我只想切换到切换位置和无点击事件。因为当用户点击开关时,我必须在数据库中插入数据。我会这样解决:1.忘记触发器2.您可以将IsToggled绑定到模型中的bool属性。3.模型有另一个名为“IsToggledProgrammatically”4.如果字符串长度超过7个字符,则可以将此属性设置为true。5.触发事件时,请选中“IsToggledProgrammatically”“,如果是真的,那么忽略。不管怎样,什么样的解决方案需要根据标签文本长度进行切换?:D我不知道有什么更好的解决方案:D我会看看我是否能实现你所说的。谢谢你举个例子,模型在最初的帖子中。嘿,现在运行得很好。我还有另一个
    <local:CustomSwitch 
           Grid.Row="0" Grid.RowSpan="2" Grid.Column="1" 
           HorizontalOptions="Start" VerticalOptions="Center" 
           ToggledStateFromCode="{Binding IsSwitchOn}" 
           UserToggled="SwitchMenu_OnToggled">
        <Switch.Triggers>
            <DataTrigger TargetType="{x:Type local:CustomSwitch}" 
                         Binding="{Binding Source={x:Reference LabelReserved},
                         Path=Text.Length}" Value="7">
                <Setter Property="ToggledStateFromCode" Value="true" />
            </DataTrigger>
        </Switch.Triggers>
    </local:CustomSwitch>