如何在mvvm中的rectangle-command上使用multibinding?

时间:2017-04-03 14:56:55

标签: wpf mvvm-light multibinding

我得到了以下矩形

_dbset.Add(user)

矩形绑定到在上面的ItemsControl中声明的模型。文档结构如下:

<Rectangle
    Width="{Binding Width}"
    Height="{Binding Length}"
    Tag="{Binding Id}"
    Name="rectangleDrawnMachine">

    <i:Interaction.Triggers>
        <i:EventTrigger
            EventName="MouseDown">
            <cmd:EventToCommand
                Command="{Binding Main.UpdateSelectedMachine, Mode=OneWay, Source={StaticResource Locator}}"
                PassEventArgsToCommand="True"
                CommandParameter="{Binding ElementName=rectangleDrawnMachine}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
</Rectangle>

现在我的 UpdateSelectedMachine - 命令至少需要三个矩形属性:

  • 位置x
  • 位置y
  • ID / Tag

使用矩形本身的CommandParameter,我的命令将获得有关矩形的许多信息(如必要的标记)。但它没有得到关于画布(X-和Y-)位置的必要信息。

所以我的问题是:如何在我的rectangle-command上使用multibinding?以及如何转移画布的位置?

2 个答案:

答案 0 :(得分:2)

使用命令参数无法传递多个值。

为此,您必须使用多重绑定。

<cmd:EventToCommand
            Command="{Binding Main.UpdateSelectedMachine, Mode=OneWay, Source={StaticResource Locator}}"
            PassEventArgsToCommand="True">
<cmd:EventToCommand.CommandParameter>
 <MultiBinding Converter="{StaticResource YourConverter}">
                 <Binding Path="Canvas.Left" ElementName="canvasDrawnMachines"/>
                 <Binding Path="Canvas.Top" ElementName="canvasDrawnMachines"/>
                 <Binding Path="Tag" ElementName="canvasDrawnMachines"/>
 </MultiBinding>
</cmd:EventToCommand.CommandParameter>

您的转换器:

public class YourConverter : IMultiValueConverter
{
    public object Convert(object[] values, ...)
    {
        return values.Clone();
    }
}

然后,执行命令逻辑:

public void OnExecute(object parameter)
{
    var values = (object[])parameter;
    var left = (double)values[0];
    var top = (double)values[1];
    var tag = values[2]; 
}

答案 1 :(得分:1)

您可以将作为命令参数传递的Canvas.Left的{​​{1}}和Canvas.Top附加属性的值获取到命令中,如下所示:

Rectangle
  

你知道如何以XAML方式获得这个位置吗?

double x = Canvas.GetLeft(rectangle); double y = Canvas.GetTop(rectangle); 与转化器一起使用并绑定到MultiBindingCanvas.Left属性:

Canvas.Top
相关问题