今天比較閑,做一個練手的項目,結果在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>