WPF MVVM Multibinding - как передать два параметра в команду с помощью RelayCommand
Как передать 2 параметра в команду, используя RelayCommand. Мне нужно передать COntrols в качестве параметров (Grid и Window). Я полностью осознаю, что такого рода проблемы уже существовали при переполнении стека, но я пытаюсь приспособить это к своим потребностям.
- Смотри, смотри моя первая попытка следующая. Очевидно, это не работает, потому что реле не может получить 2 аргумента.
XAML код:
<Button Name="StretchScreenBtn" Content="Stretch screen" DataContext=" {StaticResource CommandWindow}" Command="{Binding ResizeScreenCommand}"
Width="100" Height="50">
<Button.CommandParameter>
<MultiBinding Converter="{StaticResource CommandParamsConv}">
<Binding ElementName="ScreenGrid" />
<Binding RelativeSource="{RelativeSource AncestorType=Window}" />
</MultiBinding>
</Button.CommandParameter>
</Button>
Код команды из ViewModel:
private ICommand _ResizeScreenCommand;
public ICommand ResizeScreenCommand
{
get
{
if (_ResizeScreenCommand == null)
{
_ResizeScreenCommand = new RelayCommand(
(argument1, argument2) =>
{
Grid grid = argument1 as Grid;
Window window = argument2 as Window;
if ((int)grid.GetValue(Grid.ColumnSpanProperty) == 2)
{
grid.SetValue(Grid.ColumnSpanProperty, 1);
window.WindowStyle = WindowStyle.None;
}
else
{
grid.SetValue(Grid.ColumnSpanProperty, 2);
window.WindowStyle = WindowStyle.SingleBorderWindow;
}
}
);
}
return _ResizeScreenCommand;
}
}
И MultiValueConverter:
class CommandParamsConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
object[] parameters = values;
return parameters;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
- Моя вторая попытка я последовал решению от Как передать несколько параметров RelayCommand?
Итак, я создал в ViewModel новый класс с двумя свойствами Grid и Window, а затем попытался связать элементы xaml с этими свойствами. Но в этом случае компилятор жалуется, что эти свойства не зависят и не могут быть связаны.
Пожалуйста, дайте мне подсказку, как решить это?
Ниже приведен модифицированный код xaml:
<Button Name="StretchScreenBtn" Content="Stretch screen" DataContext="{StaticResource CommandWindow}" Command="{Binding ResizeScreenCommand}"
Width="100" Height="50">
<Button.CommandParameter>
<vm:StretchingModel Grid="{Binding ElementName=ScreenGrid}" Win="{Binding RelativeSource={RelativeSource AncestorType=Window}}" />
</Button.CommandParameter>
</Button>
И дополнительный класс в ViewModel:
class StretchingModel
{
public Grid Grid { get; set; }
public Window Win { get; set; }
}
1 ответ
Проходя Grid
и Window
модель представления не является MVVM... модель представления не должна иметь каких-либо зависимостей от каких-либо элементов пользовательского интерфейса.
В любом случае, чтобы передать в команду более одного значения, вам следует объединить два подхода. Конвертер должен вернуть экземпляр StretchingModel
:
class CommandParamsConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return new StretchingModel() { Grid = values[0], Window = values[1] };
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
... что команда принимает:
private ICommand _ResizeScreenCommand;
public ICommand ResizeScreenCommand
{
get
{
if (_ResizeScreenCommand == null)
{
_ResizeScreenCommand = new RelayCommand(
(argument) =>
{
StretchingModel model = argument as StretchingModel;
...
}
);
}
return _ResizeScreenCommand;
}
}