我正在尝试使用Caliburn Micro自学WPF,MVVM。到目前为止一切顺利,但是当我的视图中的一个comboBox改变它的选择时,我试图在我的ViewModel中触发一个事件。
这是我的观点的顶部(在Xaml中):
<Window x:Class="Translator.Views.TranslatorView"
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:model="clr-namespace:Translator.ViewModels"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DataContext="{d:DesignInstance Type=model:TranslatorViewModel}"
Title="Translator" Height="269.301" Width="1030.263"
xmlns:cal="http://www.caliburnproject.org">
这是我的ComboBox的Xaml:
<ComboBox Name="StoreCombo" Grid.Column="3" Grid.Row="0" Margin="10" Height="25" SelectedValue="{Binding Type}"
cal:Message.Attach="[Event SelectionChanged] = [StoreSelectionChanged]"
cal:Action.Target="{Binding ElementName=StoreCombo, Path=DataContext}">
</ComboBox>
这是我的ViewModel中的事件:
public void StoreSelectionChanged(object sender, SelectionChangedEventArgs args)
{
}
但是,在运行应用程序并更改选择时,我收到此异常:
&#34;未处理的类型&#39; System.Exception&#39;发生在WindowsBase.dll中 附加信息:找不到方法StoreSelectionChanged的目标。 如果存在此异常的处理程序,则可以安全地继续该程序。&#34;
我试图谷歌这个,但到目前为止,我无法弄清楚我需要做什么。
任何人都可以帮助我吗?
非常感谢
答案 0 :(得分:6)
<ComboBox Name="StoreCombo" SelectedValue="{Binding Type}"
cal:Message.Attach="[Event SelectionChanged] = [StoreSelectionChanged]"
cal:Action.Target="{Binding ElementName=StoreCombo, Path=DataContext}">
</ComboBox>
(1):目标已经是它的DataContext,所以只需删除这一行。
cal:Action.Target="{Binding ElementName=StoreCombo, Path=DataContext}"
(2)Caliburn Cheat Sheet,如果您不需要(发件人,EventArgs)
cal:Message.Attach="[Event SelectionChanged] = [Action StoreSelectionChanged]"
(2.1)如果你想要 eventargs :
cal:Message.Attach="[Event SelectionChanged] = [Action StoreSelectionChanged($eventArgs)]"
(2.2)如果您想要发件人和 eventargs
cal:Message.Attach="[Event SelectionChanged] = [Action StoreSelectionChanged($this,$eventArgs)]"
答案 1 :(得分:3)
删除方法中的方法参数,因为您没有向方法传递任何参数。
将其更改为:
public void StoreSelectionChanged()
{
}
另外,在旁注中,由于您已经在ViewModel中绑定了 SelectedValue
属性,因此您不需要此事件。将代码放在SelectedValue的属性设置器中。