wpf eventsetter处理程序绑定样式

时间:2011-10-13 13:40:05

标签: c# wpf binding

我有一个样式,我想用[{1}}将命令绑定到EventSetter的{​​{1}}。该命令位于viewModel中。

Handler

问题是我收到错误,因为这有问题(也许不可能以这么简单的方式做到这一点)

我之前搜索了很多,我找到了RelativeSource,但我认为它不适用于样式。

你能否就如何解决这个问题给出一些提示?

更新13/10/2011

我在MVVM Light Toolkit <Style x:Key="ItemTextBlockEventSetterStyle" TargetType="{x:Type TextBlock}"> <EventSetter Event="MouseLeftButtonDown" Handler="{Binding TextBlockMouseLeftButtonDownCommand, RelativeSource={RelativeSource Self}}"/> </Style> 示例程序中找到了这个:

AttachedCommandBehaviour

但是在这里,绑定不是风格。如何将此EventToCommand置于按钮的样式中?

3 个答案:

答案 0 :(得分:25)

现在您将MouseLeftButtonDown事件绑定到TextBlock.TextBlockMouseLeftButtonDownCommandTextBlockMouseLeftButtonDownCommand不是TextBlock的有效属性,也不是它的事件处理程序。

我一直在样式中使用AttachedCommandBehavior来将命令连接到事件。语法通常如下所示(注意命令绑定中的DataContext):

<Style x:Key="ItemTextBlockEventSetterStyle" TargetType="{x:Type TextBlock}">
    <Setter Property="local:CommandBehavior.Event" Value="MouseLeftButtonDown" />
    <Setter Property="local:CommandBehavior.Command"
            Value="{Binding DataContext.TextBlockMouseLeftButtonDownCommand, 
                            RelativeSource={RelativeSource Self}}" />
</Style>

另一种方法是将EventSetter挂钩到代码隐藏中的事件,并从那里处理命令:

<Style x:Key="ItemTextBlockEventSetterStyle" TargetType="{x:Type TextBlock}">
    <EventSetter Event="MouseLeftButtonDown" 
                 Handler="TextBlockMouseLeftButtonDown"/>
</Style>

代码中的事件处理程序...

void TextBlockMouseLeftButtonDown(object sender, MouseEventArgs e)
{
    var tb = sender as TextBlock;
    if (tb != null)
    {
        MyViewModel vm = tb.DataContext as MyViewModel;

        if (vm != null && TextBlockMouseLeftButtonDownCommand != null
            && TextBlockMouseLeftButtonDownCommand.CanExecute(null))
        {
            vm.TextBlockMouseLeftButtonDownCommand.Execute(null)
        }
    }
}

答案 1 :(得分:3)

当您使用MVVM时,我建议您Galasoft MVVM Light Toolkit EventToCommand

答案 2 :(得分:0)

My answer上的{p> this question无需任何外部工具包/库即可实现。但是,它不使用RelativeSource,而且它不是100%MVVM。它在代码隐藏事件处理程序中需要一行代码。