我正在尝试使用Visual State Manager在自定义控件上设置自定义属性,但到目前为止我还没有运气。我的自定义控件只是带有附加可绑定属性的标签。
public class SelectableLabel : Label
{
public static readonly BindableProperty IsSelectedProperty = BindableProperty.Create("IsSelected", typeof(bool), typeof(SelectableLabel), false);
public bool IsSelected
{
get { return (bool)GetValue(IsSelectedProperty); }
set
{
Console.WriteLine($"MDO: {Text}.IsSelected_set={value}");
SetValue(IsSelectedProperty, value);
}
}
当控件进入IsSelected
视觉状态时,我在CollectionView中使用此控件来切换Selected
属性。
<CollectionView
x:Name="cv"
ItemsSource="{Binding Names}"
SelectionMode="Multiple"
SelectedItems="{Binding SelectedNames, Mode=TwoWay}"
VerticalOptions="Fill">
<CollectionView.ItemTemplate>
<DataTemplate>
<local:SelectableLabel
x:Name="lblName"
Text="{Binding First}">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup
x:Name="CommonStates">
<VisualState
x:Name="Normal">
<VisualState.Setters>
<Setter
Property="IsSelected"
Value="False" />
</VisualState.Setters>
</VisualState>
<VisualState
x:Name="Selected">
<VisualState.Setters>
<Setter
Property="IsSelected"
Value="True" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
</local:SelectableLabel>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
[当我在iOS模拟器上运行此程序时,当视觉状态更改为Selected
时,看不到设置器被触发。如果我将设置器中的属性更改为BackgroundColor
或Text
,则会看到预期的行为。该问题似乎特定于自定义属性。我查看了Setter.Property
的文档,它指出可以将Setter应用于BindableProperty
的IsSelected
。我是在做错什么,还是VSM不支持此功能?
据我所知,您不会在代码的任何一行中更改视觉状态,您需要使用VisualStateManager.GoToState
激活视觉状态。