C# 如果codebehind具有值,则激活按钮

C# 如果codebehind具有值,则激活按钮,c#,wpf,C#,Wpf,我想不出来。我有一个按钮,我想禁用,直到代码后面的两个字符串得到一个值。它们最初设置为null 这是我目前的按钮样式xaml: <Style TargetType="Button"> <Setter Property="Background" Value="#FF2B2B2B" /> <Setter Property="BorderBrush" Value="#FF4B4B4B" /> &

我想不出来。我有一个按钮,我想禁用,直到代码后面的两个字符串得到一个值。它们最初设置为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" />

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

<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
也是一个很好的解决方案。

如果按钮的DataContext是一个实现某种形式的属性更改事件的类,那么还有另一种方法可以做到这一点

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

public bool CanClickButton
{
    get
    {
        return !String.IsNullOrWhiteSpace(firstString)
            && !String.IsNullOrWhiteSpace(secondString);
    }
}
然后只需将
CanClickButton
RaisePropertyChanged
方法添加到这两个字符串属性的设置器中,并将按钮的IsEnabled绑定到CanClickButton


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

我看不到触发器设置
IsEnabled
。或者,您可以使用命令代替
单击
,并利用
CanExecute