WPF数据模板中绑定事件不触发问题

今天比较闲,做一个练手的项目,结果在xaml中写了一个用户的数据模板后,在其中的某个Canvas上绑定了一个鼠标左击的事件,结果调试的时候,无论怎么点击都不跳到断点那里,百思不得其解。

之后尝试不绑定事件,直接采用内联事件的写法,将事件写在控件上,并且事件的处理写在cs代码而非ViewModel中,则可以使用,如此可以判断是采用MVVM时,命令没有成功绑定到事件上。

刚开始以为是DevExpress的MVVM框架的BUG。后来改成自己手写的MVVM,并未解决问题,思考再三,觉得是数据模板并未获取到DataContext导致,于是将Canvas绑定的命令做了如下修改,将Canvas的数据上下文明确为最上层父节点的数据上下文,修改后问题解决,经过思考觉得是窗体资源不会被窗体的上下文所修饰,个人见解,并未验证。

修改前:

<Canvas Width="350" Height="80">
                    <dxmvvm:Interaction.Triggers>
                        <dxmvvm:EventToCommand EventName="MouseLeftButtonDown"  
                                               Command="{Binding ClickChatWindowToSomeOne}"  
                                               PassEventArgsToCommand="True"/>
                    </dxmvvm:Interaction.Triggers>
                    <Image Width="60" Height="60" Canvas.Top="30" Canvas.Left="20">
                        <Image.Source>
                            <MultiBinding Converter="{StaticResource imageconveter}">
                                <Binding Path="headimg"/>
                                <Binding Path="sex"/>
                            </MultiBinding>
                        </Image.Source>
                    </Image>
                    <Canvas Background="LightPink">
                        <TextBlock Text="{Binding uname}" Canvas.Left="100" Canvas.Top="40" FontSize="15" Foreground="Black" FontWeight="Bold">
                        </TextBlock>
                        <TextBlock Text="{Binding describe}"  Canvas.Left="100" Canvas.Top="70" FontSize="10" Foreground="Black"/>
                        <StackPanel Orientation="Horizontal" Canvas.Top="40" Canvas.Left="220">
                            <Image Source="image/location.png" Width="40" Height="40"/>
                            <TextBlock Text="{Binding lastlocal}" FontSize="10" FontWeight="Bold" VerticalAlignment="Center"></TextBlock>
                        </StackPanel>
                    </Canvas>
                    <Separator Margin="0, 5, 0, 5"/>
                </Canvas>

修改后:{修改后的AncestorType是调用此数据模板的父节点}:

<Canvas Width="350" Height="80">
                    <dxmvvm:Interaction.Triggers>
                        <dxmvvm:EventToCommand EventName="MouseLeftButtonDown"  
                                               Command="{Binding DataContext.ClickChatWindowToSomeOne,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=ItemsControl}}"  
                                               PassEventArgsToCommand="True"/>
                    </dxmvvm:Interaction.Triggers>
                    <Image Width="60" Height="60" Canvas.Top="30" Canvas.Left="20">
                        <Image.Source>
                            <MultiBinding Converter="{StaticResource imageconveter}">
                                <Binding Path="headimg"/>
                                <Binding Path="sex"/>
                            </MultiBinding>
                        </Image.Source>
                    </Image>
                    <Canvas Background="LightPink">
                        <TextBlock Text="{Binding uname}" Canvas.Left="100" Canvas.Top="40" FontSize="15" Foreground="Black" FontWeight="Bold">
                        </TextBlock>
                        <TextBlock Text="{Binding describe}"  Canvas.Left="100" Canvas.Top="70" FontSize="10" Foreground="Black"/>
                        <StackPanel Orientation="Horizontal" Canvas.Top="40" Canvas.Left="220">
                            <Image Source="image/location.png" Width="40" Height="40"/>
                            <TextBlock Text="{Binding lastlocal}" FontSize="10" FontWeight="Bold" VerticalAlignment="Center"></TextBlock>
                        </StackPanel>
                    </Canvas>
                    <Separator Margin="0, 5, 0, 5"/>
                </Canvas>

转载于:https://www.cnblogs.com/qwqwQAQ/p/11569787.html

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值