Передайте пользовательское свойство непосредственно в Команду WPF вместо того, чтобы сначала сохранить его в ViewModel - PullRequest
0 голосов
/ 05 ноября 2019

Ниже вы видите stackPanel, где пользователь должен выбрать опцию из перечисления с помощью переключателей. Итак, CoffeeStrength - это перечисление, и с помощью конвертера я могу установить правильное значение.

<StackPanel Grid.Column="0" Orientation="Vertical" HorizontalAlignment="Center">
    <Label FontWeight="Bold">Strength</Label>
    <RadioButton GroupName="Strength" IsChecked="{Binding Path=CoffeeStrength, Converter={StaticResource EnumToBool}, ConverterParameter=Weak}">Weak</RadioButton>
    <RadioButton GroupName="Strength" IsChecked="{Binding Path=CoffeeStrength, Converter={StaticResource EnumToBool}, ConverterParameter=Normal}">Normal</RadioButton>
    <RadioButton GroupName="Strength" IsChecked="{Binding Path=CoffeeStrength, Converter={StaticResource EnumToBool}, ConverterParameter=Strong}">Strong</RadioButton>
</StackPanel>

Ниже вы видите мою кнопку, которая использует собственный класс в качестве CommandParameter. Я хотел бы добавить значение выше (CoffeeStrength) в качестве дополнительного параметра в этой команде вместо сохранения значения CoffeeStrength в моей ViewModel (см. Привязку).

<Button Content="Cappuccino + sugar"
        Command="{Binding DrinkCommand}"
        Style="{StaticResource DrinkButton}">
     <Button.CommandParameter>
           local:DrinkCommandParameters Name="Cappuccino" Milk="False" Sugar="True"/>
     </Button.CommandParameter>
</Button> 

Другими словами, я хотел быудалить свойство CoffeeStrength из моей ViewModel и передать его только в DrinkCommand. Так как мне нужно знать значение только при активации команды. Ниже вы видите перечисление и ненужные? недвижимость в viewmodel. Установщик никогда не используется в коде, так как пользователь решает силу.

public enum Strength
    {
        Normal = 0, Weak, Strong
    }

private Strength _coffeeStrength;
    public Strength CoffeeStrength
    {
        get { return _coffeeStrength; }
        set { _coffeeStrength = value; RaisePropertyChanged(() => CoffeeStrength); }
    }

Есть ли способ удалить свойство CoffeeStrength из ViewModel и передать значение непосредственно DrinkCommand в XAML?

1 Ответ

1 голос
/ 05 ноября 2019

Да, это возможно. Но для того, чтобы вы могли передать значение CoffeeStrength команде, вам необходимо расширить класс DrinkCommandParameters с помощью свойства зависимости, например CoffeeStrength. Я сомневаюсь, что это лучшее решение, просто оставьте его в ViewModel .

Так что решение будет таким:

  • расширить ваш DrinkCommandParameters свойством зависимости
  • установить x:Name для каждого RadioButton
  • использовать MultiBinding с привязками к каждому RadioButton, например, через ElementName, чтобы установить свойство зависимости для силы кофе.
  • Реализуйте класс с IMultiValueConverter и используйте этот конвертер в MultiBinding

Тогда ваш XAML может выглядеть примерно так:

<StackPanel Grid.Column="0" Orientation="Vertical" HorizontalAlignment="Center">
    <Label FontWeight="Bold">Strength</Label>
    <RadioButton x:Name="rbWeak" GroupName="Strength" IsChecked="True">Weak</RadioButton>
    <RadioButton x:Name="rbNormal" GroupName="Strength" IsChecked="False">Normal</RadioButton>
    <RadioButton x:Name="rbStrong" GroupName="Strength" IsChecked="False">Strong</RadioButton>
</StackPanel>
<Button Content="Cappuccino + sugar" Command="{Binding DrinkCommand}" Style="{StaticResource DrinkButton}">
    <Button.CommandParameter>
        <local:DrinkCommandParameters Name="Cappuccino" Milk="False" Sugar="True">
            <local:DrinkCommandParameters.CofeeStrength>
                <MultiBinding Converter="{StaticResource YourCofeeStrengthMultiValueConverter}">
                    <Binding Path="IsChecked" ElementName="rbWeak"/>
                    <Binding Path="IsChecked" ElementName="rbNormal"/>
                    <Binding Path="IsChecked" ElementName="rbStrong"/>
                </MultiBinding>
            </local:DrinkCommandParameters.CofeeStrength>
        </local:DrinkCommandParameters>
    </Button.CommandParameter>
</Button>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...