Обновить строку из другого объекта OnTouchAction - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть класс объекта, производный от BoxView.К объекту прикреплен TouchEffect, и при запуске OnTouchAction я изменяю свойства объекта.

Я также хотел бы изменить свойство метки на основе текста, прикрепленного к строке, к которой привязан метка.

Я создал экземпляр страницы, содержащейсвязываемая строка и метка, затем я попытался изменить значение строки, ссылаясь на него в коде внутри метода OnTouchAction.

Я не получаю ошибок, и точка останова сообщает мне, что код поступает в строку, но метка не обновляется.

Я пытаюсь обновить строку из класса, которыйне то же самое, где строка.

Кто-нибудь может мне помочь?

class Element : BoxView
{
    List<long> ids = new List<long>();
    MainPage mainPage = new MainPage();

    public event EventHandler StatusChanged;

    public Element()
    {
        TouchEffect effect = new TouchEffect();
        effect.TouchAction += OnTouchEffectAction;
        Effects.Add(effect);
    }

    public Color DefaultColor { set; get; }

    public Color HighlightColor { set; get; }

    public bool IsPressed { private set; get; }

    void OnTouchEffectAction(object sender, TouchActionEventArgs args)
    {
        switch (args.Type)
        {
            case TouchActionType.Pressed:
                AddToList(args.Id);
                mainPage.LeftLabelText = "entered";
                break;

            case TouchActionType.Entered:
                if (args.IsInContact)
                {
                    AddToList(args.Id);
                    mainPage.LeftLabelText = "entered";
                }
                break;

            case TouchActionType.Moved:
                break;

            case TouchActionType.Released:
            case TouchActionType.Exited:
                RemoveFromList(args.Id);

                break;
        }
    }

    void AddToList(long id)
    {
        if (!ids.Contains(id))
        {
            ids.Add(id);
        }

        CheckList();
    }

    void RemoveFromList(long id)
    {
        if (ids.Contains(id))
        {
            ids.Remove(id);
        }

        CheckList();
    }

    void CheckList()
    {
        if (IsPressed != ids.Count > 0)
        {
            IsPressed = ids.Count > 0;
            Color = IsPressed ? HighlightColor : DefaultColor;
            mainPage.LeftLabelText = "entered";
            StatusChanged?.Invoke(this, EventArgs.Empty);
        }
    }
}

и соответствующий код MainPage:

Element element = new Element();
                            element.HighlightColor = Color.Accent;
                            element.DefaultColor = Color.Transparent;
                            element.Color = bar.DefaultColor;
                            element.HeightRequest = sGrid.Height;    
                            element.VerticalOptions = LayoutOptions.End;

(...) // adding element view to the grid.

Строка:

public string _leftLabelText = "testing";
    public string LeftLabelText
    {
        get => _leftLabelText;
        set
        {
            _leftLabelText = value;
            NotifyPropertyChanged("LeftLabelText");
        }
    }

 #region INotifyPropertyChanged
    public event PropertyChangedEventHandler PropertyChanged2;
    protected void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
    {
        PropertyChanged2?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
    #endregion



<Label x:Name="leftLabel" x:FieldModifier="public" Text="{Binding LeftLabelText, Mode=TwoWay}" TextColor="Black" FontSize="10" HorizontalOptions="CenterAndExpand" VerticalOptions="CenterAndExpand"/>
...