0

我正在使用 System.Windows.Interactivity.dll 和 Microsoft.Expression.Interaction.dll 在我的 MVVM WPF 项目中的 Viewmodel 中进行事件处理。下面是我的 Xaml 中的代码:

 <ItemsControl ItemsSource="{Binding Path= HeaderList}" Grid.Row="0" Grid.Column="0" >
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                  <TextBlock   Text="{Binding Text}" Width="100" HorizontalAlignment="Left" >  
                      <i:Interaction.Triggers>
                          <i:EventTrigger EventName="PreviewMouseLeftButtonDown">
                             <ie:CallMethodAction MethodName="PrevMouseDownEventHandler" TargetObject="{Binding}" />
                          </i:EventTrigger>
                       </i:Interaction.Triggers>
                </TextBlock>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

为此,我在同一个 Xaml 中添加了命名空间。

 xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
 xmlns:ie="http://schemas.microsoft.com/expression/2010/interactions"

在我的视图模型中,我创建了一个PrevMouseDownEventHandler名称与我在 Xaml 中的 EventTigger 中提到的 CallMethod 名称相同的方法。

在运行我的应用程序时,当我在 TextBlock 事件上按下鼠标按钮时,会生成并查找方 PrevMouseDownEventHandler​​法并让我陷入以下异常:

Could not find method named 'PrevMouseDownEventHandler' on object of type 'string' that matches the expected signature.

此方法在我的 ViewModel 中如下所示。

public void PrevMouseMoveEventHandler(object sender, MouseButtonEventArgs e)
    {
        // Some implementation here;  
    }

我不知道我哪里出错了。除此之外,Viewmodel 中的所有功能对我来说都可以正常工作。对此有什么可能的解决方案?

4

2 回答 2

1

CallMethodAction是一个没有参数也没有返回值的委托。所以“处理程序”(实际上是一个动作触发器)必须看起来像这样:

public void PrevMouseMoveEventHandler()
{
    // Some implementation here;  
}

此外,您需要绑定到视图模型(您当前的绑定指向 中的当前项目ItemsControl)。RelativeSource您可以使用绑定来做到这一点:

<ie:CallMethodAction MethodName="PrevMouseDownEventHandler" 
    TargetObject="{Binding Path=DataContext,RelativeSource={RelativeSource AncestorType=ItemsControl}" />
于 2012-09-26T05:57:48.090 回答
0

它正在寻找您已将 Text 属性绑定到的 String 对象上的方法。

基本上,您的数据上下文已从视图模型更改为视图模型的属性。

于 2012-09-26T05:59:16.503 回答