无法解决这个问题。我有一个我想要禁用的按钮,直到后面的代码中的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" />
答案 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。
我喜欢这样做,因为我还没有学会如何实现命令。但是,对于更大的项目,我认为命令是更好的方法。