zoukankan      html  css  js  c++  java
  • (WPF, MVVM) Event 处理

    WPF的有些UI元素有Command属性可以直接实现绑定,如Button

    但是很多Event的触发如何绑定到ViewModel中的Command呢?

    答案就是使用EventTrigger可以实现。

    继续上一篇对Slider的研究,在View中修改Interaction.

                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="ValueChanged">
                        <i:InvokeCommandAction Command="{Binding ValueChangedCommand}" />
                    </i:EventTrigger>
                </i:Interaction.Triggers>

    那么如果将EventName修改为Thumb.DragCompleted 后发现这个事件并不会被触发
    原因是:Because the command is hooked up to the Slider, but the event is fired on the Thumb。

    (参考:http://stackoverflow.com/questions/14331272/issue-with-thumb-dragstarted-event-with-mvvmlight

    参考上述链接中Tom Allen的方法后可以实现, 但是这个方法并没有很好的遵守MVVM模式。

    于是接着研究,既然DragCompleted是挂在Thumb上面的,那么为何不直接和Thumb 绑定呢?

    修改Slider的ControlTemplate, 在Track控件中的Thumb中绑定Event 成功!

        <UserControl.Resources>
            <ControlTemplate x:Key="trackThumb" TargetType="{x:Type Slider}">
                <Border Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}">
                    <Grid>
                        <Track x:Name="PART_Track">
                            <Track.Thumb>
                                <Thumb Width="10">
                                    <i:Interaction.Triggers>
                                        <i:EventTrigger EventName="DragCompleted">
                                            <i:InvokeCommandAction Command="{Binding ValueChangedCommand}" />
                                        </i:EventTrigger>
                                    </i:Interaction.Triggers>
                                </Thumb>
                            </Track.Thumb>
                        </Track>
                    </Grid>
                </Border>
            </ControlTemplate>
        </UserControl.Resources>

    参考:

    http://social.technet.microsoft.com/wiki/contents/articles/18199.event-handling-in-an-mvvm-wpf-application.aspx

    http://www.codeproject.com/Articles/274982/Commands-in-MVVM#example9

  • 相关阅读:
    8月10日
    8月9日
    8月8日
    8月7日
    8月6日
    8月5日
    《大道至简》读后感
    8月4日
    8月3日
    8月2日
  • 原文地址:https://www.cnblogs.com/fdyang/p/3918921.html
Copyright © 2011-2022 走看看