我有一个简单的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 ...}”的几种组合,但没有帮助。
谢谢
答案 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>