WPF(mvvm,caliburn.micro)按钮在列表视图项内单击

时间:2018-11-30 14:19:12

标签: wpf listview button caliburn.micro

我有一个简单的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的方法,场景是当用户单击listviewitem中的按钮时,应调用RunOperation方法。但是,我得到一个例外:“未找到方法RunOperation的目标。”

我已经知道caliburn micro在这种情况下不起作用,如果是这种情况,我意识到我仍然不知道如何以简单的WPF方式使其工作。

显然,找不到RunOperation方法,所以我尝试了cal:Action.TargetWithoutContext =“ {Binding ...}”的几种组合,但没有帮助。

谢谢

6 个答案:

答案 0 :(得分:1)

如果有人仍在寻找解决方案,这就是我所做的,参考caliburn.micro和xaml中的交互性,如下所示,

xmlns:cal="clr-namespace:Caliburn.Micro;assembly=Caliburn.Micro.Platform"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
<Button Content="Run">
  <i:Interaction.Triggers>
    <i:EventTrigger EventName="Click">
      <cal:ActionMessage MethodName="RunOperation">
         <cal:Parameter Value="{Binding}" />
      </cal:ActionMessage>
    </i:EventTrigger>
  </i:Interaction.Triggers>
</Button>

视图模型按钮的点击方法为

public void RunOperation(object obj)
        {
            //Do your things
        }

答案 1 :(得分:0)

由于涉及按钮的xaml不存在问题,因此不确定是否已经尝试过此操作,但是下面的操作应该可以帮助您在Button的click事件上点击该功能。

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

答案 2 :(得分:0)

我对caliburn.micro一无所知。
但是通常的WPF方法就是这样

步骤1: 在您的Command

中创建一个ViewModel
class ViewModel
{
    ...
    public ICommand RunOperationCommand { get; }
    ...
}

第2步:与其绑定

<Button Command="{Binding RunOperationCommand }" />

答案 3 :(得分:0)

那不是caliburn.micro解决方案。而且我不知道对于这种情况是否有有效的caliburn.micro解决方案。

但是以下方法可行:

<Button Command="{Binding DataContext.RunOperationCommand, RelativeSource={RelativeSource AncestorType=ListBox}}" />

答案 4 :(得分:0)

我遇到了同样的问题,而且我试图使用普通的WPF方法解决该问题。

我在一个列表控件中动态创建了Button,该控件的来源是可绑定的传感器集合(我的班级)。 您需要确保添加对“ xmlns:i =“ clr-namespace:System.Windows.Interactivity; assembly = System.Windows.Interactivity”的引用,并且 您的UserControl或Window上的“ xmlns:cal =“ http://www.caliburnproject.org”。

可以在Caliburn Micro Docs上找到所有信息和示例: CaliburnActions Docs

<UserControl x:Class="BeckerGasApp.Views.MapView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:BeckerGasApp.Views"
             xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
             xmlns:cal="http://www.caliburnproject.org">
    <Grid>          
            <Grid>                 
                <ItemsControl x:Name="Sensors" Background="Transparent" ItemsSource="{Binding Path=Sensors, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}">
                    <ItemsControl.ItemTemplate>
                        <DataTemplate >                               
                                <Button Background="Transparent" Content="{Binding SensorName}" >
                                    <i:Interaction.Triggers>
                                        <i:EventTrigger EventName="Click">
                                            <cal:ActionMessage MethodName="Sensor">
                                                <cal:Parameter Value="{Binding SensorName}" />
                                            </cal:ActionMessage>
                                        </i:EventTrigger>
                                    </i:Interaction.Triggers>
                                </Button>                          
                    </DataTemplate>
                    </ItemsControl.ItemTemplate>
                </ItemsControl>
            </Grid>
        </Viewbox>
    </Grid>
</UserControl>

答案 5 :(得分:0)

为了在 listview 中执行此操作,我有以下额外标记 cal:Action.Target 以便能够访问 ÀctionMessage 中的项目的 listview

<ListView
    x:Name="LV"
    Background="Transparent"
    BorderBrush="Transparent"
    ScrollViewer.HorizontalScrollBarVisibility="Disabled">

    <ListViewItem>
        <Button x:Name="StartPage">
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="Click">
                    <cal:Action.Target>
                        <cal:ActionMessage MethodName="StartPage">
                            <cal:Parameter Value="{Binding}" />
                        </cal:ActionMessage>
                    </cal:Action.Target>
                </i:EventTrigger>
            </i:Interaction.Triggers>

            <Button.Template>
                <ControlTemplate>
                    <StackPanel Width="210" Orientation="Horizontal">
                        <Image Source="../Assets/img_home.png" Stretch="None" />
                        <TextBlock Style="{StaticResource font_style}" Text="Home" />
                    </StackPanel>
                </ControlTemplate>
            </Button.Template>
        </Button>                            
</ListViewItem>