Нажмите кнопку WPF (mvvm, caliburn.micro) внутри элемента списка - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть простая структура listview и listviewitem.

Сердце ListView.xaml похоже на следующее

<StackPanel>
    <ListBox x:Name="Movies" SelectedItem="{Binding SelectedMovie}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <v:ListItemView/>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</StackPanel>

, а сердце ListTtemView.xaml следующее:

<StackPanel>
    <TextBlock Text="{Binding Id}"/>
    <TextBlock Text="{Binding Title}"/>
    <Button cal:Message.Attach="RunOperation" cal:Action.TargetWithoutContext="{Binding ElementName=UserControl, Path=DataContext}" Content="Run"/>
</StackPanel>

в ListViewItemViewModel, у меня есть метод, называемый RunOperation, и сценарий, когда пользователь нажимает кнопку в элементе listview, должен вызываться метод RunOperation.Однако я получаю исключение: «Не найдена цель для метода RunOperation.»

Я прочитал, что caliburn micro не работает в таком случае, и если это так, я понял, что все ещене знаю, как заставить его работать простым способом WPF.

По-видимому, метод RunOperation не может быть найден, поэтому я попробовал несколько комбинаций cal: Action.TargetWithoutContext = "{Binding ...}", но не помог.

Спасибо

Ответы [ 3 ]

0 голосов
/ 01 декабря 2018

Я ничего не знаю о caliburn.micro.
Но нормальный подход WPF будет следующим:

Шаг 1: Создайте Command в вашем ViewModel

class ViewModel
{
    ...
    public ICommand RunOperationCommand { get; }
    ...
}

Шаг 2: Привязать к нему

<Button Command="{Binding RunOperationCommand }" />
0 голосов
/ 02 декабря 2018

Это не решение caliburn.micro.И я не знаю, есть ли правильное решение caliburn.micro для подобных ситуаций.

Но работает следующее:

<Button Command="{Binding DataContext.RunOperationCommand, RelativeSource={RelativeSource AncestorType=ListBox}}" />
0 голосов
/ 30 ноября 2018

Поскольку ваша кнопка с участием xaml недоступна в вопросе, я не уверен, что вы уже пробовали это сделать, но следующее поможет вам включить функцию нажатия кнопки Button.

<Button cal:Message.Attach="[Event Click] = [Action RunOperation]"/>
...