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