没有按钮的MVVM命令

时间:2010-10-13 20:00:07

标签: wpf user-controls mvvm command

我想发起一个绑定命令,但我不想在Button上使用UserControl。实际上,UserControl本身就是Button。当它在表面上的任何地方被点击时,我想发起一个绑定命令。有没有办法给UserControl一个命令?

在旁注中:一个控件的一个命令和几个开箱即用的控件?这一切似乎有点笨重。我开始认为MVVM是不切实际的。我可以使用Interfaces和OOP将我的UI解耦得很好。无论如何,我仍然有希望。

此外,我不愿意破解任何东西或使用昂贵的解决方法。如果我不能这样做,我就放弃了MVVM。

5 个答案:

答案 0 :(得分:4)

如果您的UserControl本质上是一个Button,为什么要编写自己的UserControl而不是使用Button类?

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

  1. Subclass Button,在那里放置你需要的任何额外的DependencyProperties - 它应该是一个非常空的类(你甚至可能有public class MyCoolButton : Button { }
  2. 之类的东西
  3. 添加TargetType为MyCoolButton的样式 - 不要将样式命名为适用于所有MyCoolButtons
  4. 覆盖样式的默认模板,然后粘贴Xaml代码。你可能需要在这里做一些工作来处理“正常/推/禁”状态。如果您使用的是v4.0,则可以在此处使用VSM。

答案 1 :(得分:4)

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

答案 2 :(得分:1)

我同意保罗贝茨的意见。

我经常创建自己的ListBoxItemContainerStyle,使用按钮作为顶部容器,其中只有一个无属性内容展示器。这允许我使用按钮功能(如Command),而不使用Windows Chrome。

将它放在ListBoxItemContainerStyle中也允许我这样做,以便在单击它时不显示正常的虚线边框(FocusVisualStyle = {x:Null})。

您使用Visual Studio或Expression Blend进行样式设计吗?

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

答案 3 :(得分:1)

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>

这将创建一个按钮,其中两个标签使用网格控件间隔开。我将Grid标记为关闭HitTestVisible,因为您必须决定哪些控件应该像按钮一样进行交互,哪些控件应该像控件一样进行交互。例如,您可能有一个嵌入式TextBox,您想要在不单击按钮的情况下进行单击,在这种情况下,它应该具有HitTestVisible = True。

答案 4 :(得分:0)

WPF支持图层和透明度:

Panel.ZIndex

您可以创建任何支持在高级透明图层上指定所需尺寸的内容,以充当按钮。