【发布时间】:2017-11-30 22:52:00
【问题描述】:
我有一个带有 ItemControl 的画布,它用自定义 UserControlViewModels 填充 ViewModel。我想给每个 UserControl 一个 MouseEnter 命令什么的。
我的 ViewModel 的 XAML 如下:
<Canvas x:Name="gameFieldCanvas" Width="{Binding CanvasWidth}" Height="{Binding CanvasHeight}">
<ItemsControl ItemsSource="{Binding GameFieldContent}">
<ItemsControl.ItemTemplate>
<DataTemplate DataType="{x:Type local:GameFieldTileViewModel}">
<Canvas>
<local:GameFieldTileUserControl X="{Binding TileX}" Y="{Binding TileY}">
<local:GameFieldTileUserControl.InputBindings>
<MouseBinding MouseAction="LeftClick"
Command="{Binding DataContext.OnGameFieldTileLeftClicked, RelativeSource={RelativeSource AncestorType=ItemsControl}}"
CommandParameter="{Binding}"/>
<MouseBinding MouseAction="RightClick" Command="{Binding DataContext.OnGameFieldTileRightClicked, RelativeSource={RelativeSource AncestorType=ItemsControl}}"
CommandParameter="{Binding}"/>
</local:GameFieldTileUserControl.InputBindings>
</local:GameFieldTileUserControl>
</Canvas>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Canvas>
如您所见,我已经有用于 Left-/RightClick 的命令,它工作正常。但是 MouseEnterEvents 没有 InputBindings。
我已经阅读了有关可以编写 EventTriggers 或类似内容的 Blend SDK 的信息,但是使用板工具是否可以实现?
我只是想实现当一个 UserControl 被输入时获取它的 UserControlViewModel。
【问题讨论】:
-
什么意思?
-
因为在 ViewModel 中处理 MouseEvents?我想操作
GameFieldContent所以我需要画布的 ViewModel 中的命令。有没有更好的办法? -
我不知道你在做什么,所以我无法判断。我只能说这味道。您的 UI 应该只与您的 VM 传达您的用户意图,然后更新以响应 VM 状态的变化。您似乎正在将鼠标输入传输到正在解释意图的视图模型中。这应该在 UI 中完成。无论如何,在考虑您的设计时请记住这一点。祝你好运。
-
我知道。理论和实践并不总是兼容的,至少我并不总是看路。问题是我的
MapView中有一个MapViewModel,包括用GameFieldViewModels填充的画布,在视图中代表GameFieldTiles。当我希望在MapViewModel中发生操作时,在每个GameFieldViewModel中都有MouseEventHandler有什么帮助。我的意思是不要误会我,我想要的只是“输入/单击了哪个 Tile 等”。知道我必须更改哪些模型。然后更改发生在调用PropertyChanged方法的模型中。 -
哇,听起来不错,真的!几周以来我是 wpf/c# 的新手,所以我不知道其中的技巧。而且我认为即使在您的描述之后,我也无法正确实施。也许您想发布一个带有更详细描述和一些 coden-ps 的答案?