代码之家  ›  专栏  ›  技术社区  ›  Jordan

不带按钮的MVVM命令

  •  2
  • Jordan  · 技术社区  · 14 年前

    我想启动绑定命令,但不想使用 Button 在我身上 UserControl . 实际上 用户控制 本身就是 纽扣 . 当它在其表面的任何地方被单击时,我想启动一个绑定命令。有没有办法 用户控制 命令?

    在旁注中:一个命令用于一个控件,而只有几个特定的开箱即用控件?这一切似乎有点笨拙。我开始认为MVVM是不切实际的。我可以用接口和OOP来分离我的UI。不管怎样,我还是有希望的。

    此外,我不愿意黑客任何东西或使用昂贵的解决方案。如果我做不到,我就放弃MVVM。

    5 回复  |  直到 14 年前
        1
  •  4
  •   Michael Detras    14 年前

    请在此处查看ICommandSource接口: http://msdn.microsoft.com/en-us/library/system.windows.input.icommandsource.aspx . 如果希望控件具有命令,则控件应实现此接口。实现此接口的控件示例有ButtonBase和MenuItem。希望这有帮助。

        2
  •  4
  •   Ana Betts    14 年前

    如果用户控件本质上是一个按钮,为什么要编写自己的用户控件而不是使用按钮类?

    要添加更多信息,请执行以下操作:

    1. 子类按钮,在其中放置您需要的任何额外的DependencyProperties-它应该是一个非常空的类(您甚至可以拥有类似的 public class MyCoolButton : Button { }
    2. 添加targetType为的样式 MyCoolButton -不要命名样式,因此它适用于所有mycoolbuttons
    3. 重写样式的默认模板,然后粘贴到XAML代码中。您可能需要在这里做一些工作来处理“正常/推送/禁用”状态。如果您使用的是v4.0,那么可以在这里使用vsm。
        3
  •  1
  •   CodeWarrior    14 年前

    我同意保罗·贝茨的观点。

    我经常使用按钮作为顶部容器创建自己的ListBoxItemContainerStyle,其中只包含一个无属性的内容展示器。这使我可以使用按钮功能(如命令),而不必使用Windows Chrome。

    把它放在ListBoxItemContainerStyle中也可以让我这样做,当它被单击时,它不会显示正常的点状边框(focusVisualStyle=x:null)。

    您是使用Visual Studio还是Expression Blend来制作样式?

    此外,一些MVVM框架提供了一个接口,用于添加对按钮以外的控件的命令式功能。Caliburn有一个相当丰富的命令模式。但是,我不确定它是否允许在非按钮控件上绑定命令。

        4
  •  1
  •   Dan Bryant    14 年前

    OP要求提供一个示例,说明如何使用按钮控件,但内容必须正确填充整个按钮。可以使用ContentAlignment属性执行此操作:

    <Button HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch">
        <Button.Content>
            <Grid IsHitTestVisible="False">
                <Grid.RowDefinitions>
                    <RowDefinition Height="30" />
                    <RowDefinition Height="*" />
                </Grid.RowDefinitions>
                <TextBlock Grid.Row="0" Text="Row0" />
                <TextBlock Grid.Row="1" Text="Row1" />
            </Grid>
        </Button.Content>
    </Button>
    

    这将创建一个按钮,其中两个标签使用网格控件隔开。我将网格标记为关闭hitestVisible,因为您必须决定哪些控件应该像按钮一样交互,哪些控件应该像控件一样交互。例如,您可能有一个嵌入的文本框,您希望在不单击按钮的情况下可以单击它,在这种情况下,它应该具有hitestVisible=true。

        5
  •  0
  •   Matthieu kelly    14 年前

    WPF支持层和透明度:

    Panel.ZIndex
    

    您可以创建任何支持命令在一个高级透明层(您想要的大小)上作为按钮的东西。