У меня есть модель представления в формах 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
локальная переменная)?
Спасибо