首页 > 解决方案 > 如何在视图模型方法中使用绑定属性作为参数

问题描述

我在 Xamarin Forms 中有一个使用 Prism 框架的视图模型。我有很多 UI 元素,每个元素在我的视图模型中都有很多具有相似行为的绑定属性。在命令操作之后,我想对这些元素中的每一个执行完全相同的逻辑,而不必为每个元素重复相同的逻辑。

更具体一点。我在图片上有地标。每个地标都可以拖动。每个地标都有一个激活拖动模式的命令,该模式会改变地标的图标及其大小。当我创建一个方法以在单个方法中模块化这种行为时,接收每个地标绑定属性作为参数,属性的设置器永远不会触发,因此 UI 元素永远不会改变。

这是我尝试过的:

我的里程碑式 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局部变量)赋值时调用 setter?

谢谢

标签: c#xamarindata-bindingxamarin.formsprism

解决方案


推荐阅读