【发布时间】:2011-01-01 03:49:04
【问题描述】:
我仍在努力修改我现有的 WPF 应用程序以“兼容”MVVM 方法。我已经非常接近了,但不知道如何解决剩下的几个障碍之一。
我有一个 GUI 元素(目前是一个按钮,虽然它可能是一个标签),当鼠标进入它时,它会触发 MouseEnter 事件,这会在代码隐藏中创建一个弹出窗口。弹出窗口由一个带有几个按钮的简单堆栈面板布局组成。当前,每个按钮的 Click 事件都分配给同一个事件处理程序,除了我将 Tag 属性更改为执行一个简单(俗气的)命令参数。我正在与在 MVVM 中执行此操作的“正确”方法作斗争,因为我现在这样做的方式非常丑陋。
为了解决这个问题,我认为这是我应该前进的方向,但如果你能提供任何额外的意见,我将不胜感激。 :)
-
在 XAML 中创建弹出窗口。由于我的 Popup 内容是静态的,我应该能够完全在 XAML 中创建 Popup。此外,每个按钮都将绑定到同一个 ICommand 派生类。例如
<Popup x:Key="MyPopup" StaysOpen="False" Placement="Right"> <Border Background="White" BorderBrush="Black" Padding="5" BorderThickness="2" CornerRadius="5"> <StackPanel Orientation="Vertical"> <Button Command="{Binding MyCommand}" CommandParameter="5">5</Button> <Button Command="{Binding MyCommand}" CommandParameter="10">10</Button> <Button Command="{Binding MyCommand}" CommandParameter="15">15</Button> <Button Command="{Binding MyCommand}" CommandParameter="20">20</Button> </StackPanel> </Border> </Popup> -
通过触发器弹出弹出窗口,例如
<Button.Triggers> <Trigger Property="Button.IsMouseOver" Value="True"> <Setter TargetName="MyPopup" Property="IsOpen" Value="True" /> </Trigger> </Button.Triggers>
我认为 #1 没问题,但我在 #2 上苦苦挣扎。这是解决问题的正确方法吗?如果是这样,将 Popup 的 IsOpen 属性设置为 True 的正确 XAML 语法是什么?我找不到这方面的例子。
如果我的整个想法有缺陷,我很想听听我的其他选择是什么。谢谢!
【问题讨论】:
-
我看不出你的 #2 有什么问题,也许你可以提供更多关于你认为有问题的细节。
-
我收到错误消息“'IsOpen' 成员无效,因为它没有合格的类型名称。”
-
我也试过 Popup.IsOpen 并得到同样的错误。