Как использовать multibinding для команды прямоугольника в mvvm?

Я получил следующий прямоугольник

<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>

Прямоугольник связан с моделью, которая объявлена ​​в вышеупомянутом ItemsControl. Структура документа выглядит следующим образом:

<Grid>
    <ItemsControl ItemsSource="{Binding AllMachines}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <Canvas Name="canvasDrawnMachines" />
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>

        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Grid>
                    <Rectangle Name="rectangleDrawnMachine"/>
                </Grid>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</Grid>

Теперь моей команде UpdateSelectedMachine нужно как минимум три свойства прямоугольника:

  • Положение х
  • Положение у
  • ID / тег

С помощью CommandParameter самого прямоугольника моя команда получит много информации о прямоугольнике (например, необходимый тег). Но он не получает необходимой информации о (X- и Y-) положении холста.

Итак, мой вопрос: как использовать мультисвязывание для моей команды-прямоугольника? А как перенести позиции холста?

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]; 
}

Вы можете получить значения Canvas.Left а также Canvas.Top Прилагаемые свойства Rectangle что вы передаете в качестве параметра команды для команды, как это:

double x = Canvas.GetLeft(rectangle);
double y = Canvas.GetTop(rectangle);

Знаете ли вы, как получить позицию в XAML-пути?

Использовать MultiBinding с конвертером и привязать к Canvas.Left а также Canvas.Top свойства:

<MultiBinding Converter="{StaticResource converter}">
             <Binding Path="(Canvas.Left)" ElementName="canvasDrawnMachines"/>
             <Binding Path="(Canvas.Top)" ElementName="canvasDrawnMachines"/>
             <Binding Path="Tag" ElementName="canvasDrawnMachines"/>
</MultiBinding>
Другие вопросы по тегам