Xamarin用转换器表示项目分类

时间:2016-07-25 07:38:34

标签: c# xamarin xamarin.forms ivalueconverter

我需要在我的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。

screenshot

这是我的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;
}
}

1 个答案:

答案 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!中的更多信息