如果代码隐藏有值,则激活按钮

时间:2014-11-12 00:42:52

标签: c# wpf

无法解决这个问题。我有一个我想要禁用的按钮,直到后面的代码中的2个字符串有一个值。它们最初设置为null。

这是我目前的按钮样式xaml:

<Style TargetType="Button">
            <Setter Property="Background" Value="#FF2B2B2B" />
            <Setter Property="BorderBrush" Value="#FF4B4B4B" />
            <Setter Property="HorizontalAlignment" Value="Left" />
            <Setter Property="Foreground" Value="White" />
            <Setter Property="Height" Value="25" />
            <Setter Property="Width" Value="Auto" />
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type Button}">
                        <Grid x:Name="Button">
                            <Rectangle x:Name="innerRectangle"
                                       HorizontalAlignment="Stretch"
                                       VerticalAlignment="Stretch"
                                       Fill="{TemplateBinding Background}" />
                            <ContentPresenter x:Name="ContentSite"
                                              VerticalAlignment="Center"
                                              HorizontalAlignment="Center"
                                              ContentSource="Content"
                                              TextBlock.FontSize="15"/>
                        </Grid>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter Property="Background" Value="#3f3f41" />
                            </Trigger>
                            <Trigger Property="IsPressed" Value="True">
                                <Setter Property="Background" Value="#007acc" />
                            </Trigger>
                            <MultiDataTrigger>
                                <MultiDataTrigger.Conditions>
                                    <Condition Binding="{Binding Path=saveFolder}" Value="" />
                                    <Condition Binding="{Binding Source=saveFolder, Path=IsChecked}" Value="True" />
                                </MultiDataTrigger.Conditions>
                                <Setter Property="Background" Value="Green" />
                            </MultiDataTrigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

按钮它自己:

<Button Name="btnGo" Content="Go!" HorizontalAlignment="Center" Click="btnGo_Click" />

2 个答案:

答案 0 :(得分:1)

您可以通过在setter中将按钮设置为启用,并使用DataTrigger s将其设置为禁用(如果任一属性为null)来控制此操作:

<Style TargetType="Button">
    <Setter Property="IsEnabled" Value="True" />

    <!-- Other stuff in style unchanged -->

    <Style.Triggers>
        <DataTrigger Binding="{Binding SomeProperty1}" Value="{x:Null}">
            <Setter Property="IsEnabled" Value="False" />
        </DataTrigger>
        <DataTrigger Binding="{Binding SomeProperty2}" Value="{x:Null}">
            <Setter Property="IsEnabled" Value="False" />
        </DataTrigger>
    </Style.Triggers>
</Style>

我在样式而不是控件模板上使用触发器集合,因为我通常更愿意避免使用后者,除非我需要处理控件模板本身定义的元素。

正如BradleyDotNET在评论中指出的那样,设置命令并使用CanExecute也是一个很好的解决方案。

答案 1 :(得分:1)

如果您的Button的DataContext是一个实现某种形式的属性更改事件的类,那么还有另一种方法可以执行此操作...

在按钮的DataContext中,为要绑定的IsEnabled按钮创建一个新的bool属性,例如。

public bool CanClickButton
{
    get
    {
        return !String.IsNullOrWhiteSpace(firstString)
            && !String.IsNullOrWhiteSpace(secondString);
    }
}

然后只需将RaisePropertyChanged CanClickButton方法添加到两个字符串属性的setter中,然后将按钮的IsEnabled绑定到CanClickButton。

我喜欢这样做,因为我还没有学会如何实现命令。但是,对于更大的项目,我认为命令是更好的方法。