Как использовать свойство связывания в качестве параметра в методе View Model - PullRequest
1 голос
/ 24 июня 2019

У меня есть модель представления в формах Xamarin с использованием платформы Prism. У меня есть много элементов пользовательского интерфейса, каждый из которых имеет множество свойств привязки в моей модели представления, которые имеют похожее поведение. После командного действия я хочу выполнить одну и ту же логику для каждого из этих элементов без необходимости дублировать одну и ту же логику для каждого.

Чтобы быть более конкретным. У меня есть ориентиры на картинке. Каждый ориентир можно перетаскивать. У каждого ориентира есть команда, чтобы активировать режим перетаскивания, который меняет значок ориентира и его размер. Когда я создаю метод для модуляции этого поведения в одном методе, получая в качестве параметра каждое из свойств привязки ориентира, установщик свойств никогда не срабатывает, поэтому элемент пользовательского интерфейса никогда не изменяется.

Вот что я пробовал:

Мой ориентир XAML

<Controls:LandmarkView 
                                    DragMode="Touch" 
                                    LBounds="{Binding ChinLandmarkBounds, Mode=TwoWay}" 
                                    DragDirection="All"
                                    IsVisible="{ Binding AreLandmarksVisible }"
                                    ToggleDraggingCommand="{Binding ChinToggleDraggingCommand}"
                                    DraggingBoundaries="{Binding ChinDraggingBoundaries}">
                                    <Controls:LandmarkView.Content>
                                        <AbsoluteLayout>
                                            <Image BackgroundColor="#72C8BB" 
                                                   WidthRequest="{Binding LandmarkLineWidth}" 
                                                   AbsoluteLayout.LayoutBounds= "{Binding LandmarkLineXPos}"
                                                   AbsoluteLayout.LayoutFlags="YProportional,WidthProportional"/>
                                            <ffimageloading:CachedImage 
                                                WidthRequest="{Binding ChinSize}"
                                                HeightRequest="{Binding ChinSize}"
                                                Source="{Binding ChinLandmarkIcon, Converter={StaticResource SvgImageSourceConverter}}">
                                            </ffimageloading:CachedImage>
                                        </AbsoluteLayout>
                                    </Controls:LandmarkView.Content>
                                </Controls:LandmarkView>

Команда в модели представления для переключения при перетаскивании:

public ICommand ChinToggleDraggingCommand { get; set; }

Свойства привязки ориентира:

private Rectangle _chinLandmarkBounds;
    public Rectangle ChinLandmarkBounds
    {
        get { return _chinLandmarkBounds; }
        set
        {
            SetProperty(ref _chinLandmarkBounds, value);
            CalculateMouthRightEdgeDraggingBoundaries();
            CalculateMouthLeftEdgeDraggingBoundaries();
            CalculateChinDraggingBoundaries();
        }
    }
    private string _chinLandmarkIcon;
    public string ChinLandmarkIcon
    {
        get { return _chinLandmarkIcon; }
        set { SetProperty(ref _chinLandmarkIcon, value); }
    }
    private Rectangle _chinDraggingBoundaries;
    public Rectangle ChinDraggingBoundaries
    {
        get { return _chinDraggingBoundaries; }
        set { SetProperty(ref _chinDraggingBoundaries, value); }
    }
    private int _chinSize;
    public int ChinSize
    {
        get { return _chinSize; }
        set { SetProperty(ref _chinSize, value); }
    }

Метод, который я хотел бы вызвать для каждого ориентира, который не вызывает установщик свойства:

private void ToggleDraggingMode(Rectangle landmarkBounds, string landmarkIcon, int size, bool activateDraggingMode)
    {
        if (activateDraggingMode)
        {
            landmarkIcon = ControlsArrowsAllRed;
            size = size * 2;
            landmarkBounds = new Rectangle((double)landmarkBounds.X - size / 2, (double)landmarkBounds.Y - size / 2, size, size);
        }
        else
        {
            landmarkIcon = ControlsRedFull;
            size = size / 2;
            landmarkBounds = new Rectangle(landmarkBounds.X + size / 2, (double)landmarkBounds.Y + size / 2, size, size);
        }
    }

Вызов предыдущего метода:

ToggleDraggingMode(ChinLandmarkBounds, ChinLandmarkIcon, ChinSize, activateDraggingMode);

Как я могу передать свои свойства связывания в качестве параметров метода и сделать так, чтобы установщик вызывался, когда я присваиваю значение параметру метода (в предыдущем коде, landmarkBounds локальная переменная)?

Спасибо

...