我需要在我的PCL应用中对项目列表进行分类。 分类必须介于值0和3之间。 我需要3个togglebutton,每个分类值一个。 因此,如果项目分类的值为2,则前两个togglebutton isToggled属性必须为true,第三个为false。 如果项目分类的值为3,则所有三个togglebutton isToggled属性必须为true。 如果我切换到第二个togglebutton的isToggled属性,我希望分类值必须为2,其余的togglebutton根据此值更新。 问题是,例如当我切换到true时,第三个按钮。 所选插槽正确更改为T3,因此其他按钮必须刷新其isToggledProperty。例如,第一个togglebutton必须更改为IsToggled属性为true。发生这种情况,但是第一个togglebutton的isToggledProperty的更改会再次导致所选插槽的更改,这会再次将togglebuttonbutton的Istoggled属性更改为false。
这是我的togglebutton,代表分类的3值。
var t3 = new BoxView
{
Color = Color.FromHex("#00d2ff")
};
var t3ToggleBehavior = new ToggleBoxBehavior();
t3ToggleBehavior.SetBinding(ToggleBoxBehavior.IsToggledProperty, new Binding("SelectedSlot", BindingMode.TwoWay, new SelectedSlotToBooleanConverter(), converterParameter: "T3"));
t3.Behaviors.Add(t3ToggleBehavior);
var t3trigger = new DataTrigger(typeof(BoxView))
{
Binding = new Binding
{
Source = t3ToggleBehavior,
Path = "IsToggled"
},
Value = false
};
t3trigger.Setters.Add(new Setter
{
Property = BoxView.ColorProperty,
Value = Color.FromHex("#eeeeee")
});
t3.Triggers.Add(t3trigger);
grid.Children.Add(t3, 0, 0);
3 togglebutton仅对转换器参数(T1 o T2)
有所不同这是我的转换器
public class SelectedSlotToBooleanConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo language)
{
if (value != null && parameter != null)
{
var val = fromString(value.ToString());
var par = fromString(parameter.ToString());
return val >= par;
}
else
{
return false;
}
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo language)
{
if (parameter != null)
{
return fromString(parameter.ToString());
}
else
{
return parameter;
}
}
private Slot fromString(string slot)
{
switch (slot)
{
case "T1":
return Slot.T1;
case "T2":
return Slot.T2;
case "T3":
return Slot.T3;
default:
return Slot.Off;
}
}
}
这是我的ToggleBoxBehavior
public class ToggleBoxBehavior : Behavior<View>
{
TapGestureRecognizer tapRecognizer;
public static readonly BindableProperty IsToggledProperty = BindableProperty.Create<ToggleBehavior, bool>(tb => tb.IsToggled, false);
public bool IsToggled
{
set { SetValue(IsToggledProperty, value); }
get { return (bool)GetValue(IsToggledProperty); }
}
protected override void OnAttachedTo(BindableObject bindable)
{
base.OnAttachedTo(bindable);
this.BindingContext = bindable.BindingContext;
bindable.BindingContextChanged += Bindable_BindingContextChanged;
}
void Bindable_BindingContextChanged(object sender, EventArgs e)
{
var bobject = sender as BindableObject;
this.BindingContext = bobject?.BindingContext;
}
protected override void OnAttachedTo(View view)
{
base.OnAttachedTo(view);
tapRecognizer = new TapGestureRecognizer();
tapRecognizer.Tapped += OnTapped;
view.GestureRecognizers.Add(tapRecognizer);
}
protected override void OnDetachingFrom(View view)
{
base.OnDetachingFrom(view);
view.GestureRecognizers.Remove(tapRecognizer);
tapRecognizer.Tapped -= OnTapped;
}
void OnTapped(Object sender, EventArgs args)
{
IsToggled = !IsToggled;
}
}
答案 0 :(得分:0)
我知道,那太晚了,但是 我们在NuGet!中添加了ToggleButton 它是免费使用的。
xmlns:aw="clr-namespace:AscendantWare.Xamarin.Essentials.Controls"
<aw:AWToggleButton TextColor="White" ToggleBackgroundColor="DarkGoldenrod" Margin="0" VerticalOptions="FillAndExpand" HorizontalOptions="Fill" CornerRadius="15" IsToggled="{Binding IsNoteEnabled, Mode=TwoWay}" Command="{Binding MyCommand}"/>
您可以绑定IsToggled-Property并在视图模型的set函数中编写自己的逻辑。
在线文档here!中的更多信息