Как использовать 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>