使用DataTrigger设置按钮点击处理程序

时间:2019-05-27 01:10:33

标签: wpf xaml

我试图更新一些视觉属性和按钮上的单击处理程序以响应枚举的值。视觉属性很简单,但是单击处理程序给我带来了麻烦。

枚举有4个值:启动,启动,终止,终止。该按钮将根据当前状态启动或终止进程。这是我拥有的视觉属性:

<Button>
    <Button.Style>
        <Style>
            <Style.Triggers>
                <DataTrigger Binding="{Binding ProcessState}" Value="{x:Static local:ProcessState.Launching}">
                    <Setter Property="IsEnabled" Value="false"/>
                    <Setter Property="Content" Value="Launching..."/>
                </DataTrigger>
                <DataTrigger Binding="{Binding ProcessState}" Value="{x:Static local:ProcessState.Launched}">
                    <Setter Property="IsEnabled" Value="true"/>
                    <Setter Property="Content" Value="Terminate"/>
                </DataTrigger>
                <DataTrigger Binding="{Binding ProcessState}" Value="{x:Static local:ProcessState.Terminating}">
                    <Setter Property="IsEnabled" Value="false"/>
                    <Setter Property="Content" Value="Terminating..."/>
                </DataTrigger>
                <DataTrigger Binding="{Binding ProcessState}" Value="{x:Static local:ProcessState.Terminated}">
                    <Setter Property="IsEnabled" Value="true"/>
                    <Setter Property="Content" Value="Launch"/>

                    <!-- Doesn't work!
                    <EventSetter Event="Click" Handler="LaunchSim_Click"/>
                    -->
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>

问题是Style.Triggers不支持EventSetter,所以我不能用这种方法更新Button.Click。现在,我可以使用一个单击处理程序并基于枚举进行分支,但是我想从XAML方面了解什么是可能的。

我还尝试在Button.Resources中创建4种单独的样式,然后用DataTrigger换出样式,但是最终您尝试使用一种样式来更改按钮样式,但我也不相信这可行

是否存在合理的方法来从XAML更改Button.Click以响应变化的数据值?

2 个答案:

答案 0 :(得分:2)

  

是否存在合理的方法来从XAML更改caindex.html以响应变化的数据值?

不,没有。使用单击处理程序和基于枚举的分支听起来是个好主意。另外,如果您熟悉MVVM设计模式,则可以绑定到视图模型的命令并在那里处理逻辑。确实可以在Button.Click中使用Command来设置Setter属性,但是请记住XAML是一种 markup 语言,只是因为您可能可以在纯XAML中执行某些操作,但这并不意味着您总是应该这样做。

答案 1 :(得分:1)

您可以代替EventSetter

<Setter Property="Command" Value="{Binding SomeCommand}"/>

实际上,如果希望仅在枚举的一种状态下单击按钮,则可以绑定到“ SomeCommand”并创建仅在选择特定枚举类型时启用的命令。

例如

<Button Command={Binding SomeCommand} >
   Style...
</Button>

您可以在视图模型中完成

SomeCommand = new RelayCommand(SomeMethod, ()=> ProcessState == ProcessState.Terminated);