Wprowadzenie do problemu

Mam wiązanie w XAML na nieruchomości w moim modelu, zwanym "isyoungerthanseventy". IØM za pomocą pryzmatu, aby zadzwonić do polecenia na zdarzeniu TargetUpdated. W tej chwili mijam Source (BinaryQuestion) przy użyciu TriggerParameterPath="Source".

Problem

Nie mogę przejść zarówno Source i Property

Co chcę zrobić

Chciałbym również przekazać Property (IsYoungerThanSeventy) do tego samego polecenia.

Ostatecznie potrzebuję zarówno Source i Property w funkcji dzwonię do aktualizacji rzeczy.

mój kod do tej pory

<wpfQuestionnaire:BinaryQuestion
    AnswerRequired="{Binding IsYoungerThanSeventy
        , Mode=TwoWay                                          
        , NotifyOnTargetUpdated=True}">

    <i:Interaction.Triggers>
        <i:EventTrigger EventName="TargetUpdated">
            <prism:InvokeCommandAction 
                Command="{Binding PropertyBoundToAnswerRequiredChangedCommand}"
                TriggerParameterPath="Source"/>
        </i:EventTrigger>
    </i:Interaction.Triggers>
</wpfQuestionnaire:BinaryQuestion>
1
Smedegaard 16 luty 2017, 15:09

2 odpowiedzi

Najlepsza odpowiedź

Metoda Execute Interfejsu ICommand akceptuje tylko jeden parametr, dzięki czemu możesz przekazać dwie wartości, które należy utworzyć typ, który może pomieścić te dwie wartości, a następnie przejść instancję tego typu jako parametr polecenia do polecenia.

Najprostszym sposobem na to byłoby wywołanie polecenia z kodu - za widokiem i utworzyć instancję swojego typu niestandardowego tutaj, np.:

<wpfQuestionnaire:BinaryQuestion
    AnswerRequired="{Binding IsYoungerThanSeventy
        , Mode=TwoWay                                          
        , NotifyOnTargetUpdated=True}" TargetUpdated="BinaryQuestion_TargetUpdated">
</wpfQuestionnaire:BinaryQuestion>

private void BinaryQuestion_TargetUpdated(object sender, DataTransferEventArgs e)
{
    BinaryQuestion bq = sender as BinaryQuestion;
    ViewModel vm = bq.DataContext as ViewModel;
    if (vm != null)
    {
        YourCustomCompositeCommandArgumentType param = new YourCustomCompositeCommandArgumentType() { Source = bq, Parameter = vm.IsYoungerThanSeventy };
        vm.PropertyBoundToAnswerRequiredChangedCommand.Execute(param);
    }
}

Nie przełamuje tego wzoru MVVM, ponieważ po prostu wywołujesz to samo polecenie z tego samego widoku. MVVM nie chodzi o wyeliminowanie kodu z widoku, chodzi o rozdzielenie obaw.

Jeśli odmówisz wdrożenia zachowań związanych z widokiem w kodeksie z jakiegoś dziwnego powodu, będziesz musiał owinąć funkcjonalność w niestandardowej klasie {x0}}. Możesz dodać właściwości do tej klasy, która przytrzymują wartości źródłowe i właściwości, a następnie wywołał polecenie, jak wyjaśniłem w powyższym kodzie przykładowym.

1
mm8 16 luty 2017, 16:32

Czy próbowałeś przekazać argument?

<i:Interaction.Triggers>
    <i:EventTrigger EventName="TargetUpdated">
        <prism:InvokeCommandAction 
            Command="{Binding PropertyBoundToAnswerRequiredChangedCommand}"
            />
    </i:EventTrigger>
</i:Interaction.Triggers>

Następnie możesz zadeklarować komendę

PropertyBoundToAnswerRequiredChangedCommand = new DelegateCommand<DataTransferEventArgs>(OnPropertyBoundToAnswerRequiredChanged);

Z

public void OnPropertyBoundToAnswerRequiredChanged(DataTransferEventArgs e){
var isYoungerThanSeventy = e.Property as bool;
var source = e.Source;
}

I możesz użyć obu.

0
Bertrand 5 czerwiec 2018, 08:31