WPF MVVM Multibinding - как передать два параметра в команду с помощью RelayCommand

Как передать 2 параметра в команду, используя RelayCommand. Мне нужно передать COntrols в качестве параметров (Grid и Window). Я полностью осознаю, что такого рода проблемы уже существовали при переполнении стека, но я пытаюсь приспособить это к своим потребностям.

  1. Смотри, смотри моя первая попытка следующая. Очевидно, это не работает, потому что реле не может получить 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();
        }
     }
  1. Моя вторая попытка я последовал решению от Как передать несколько параметров 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;
    }
}
Другие вопросы по тегам