WPF - 按钮控件模板...当Command.CanExecute为false时,启用模板项

时间:2013-01-15 20:40:41

标签: wpf command datatemplate controltemplate canexecute

我有一个listView,其中每个项目都包含一个包含Button的dataTemplate。这是因为要求单击列表项将像按钮单击一样,将您带到“向导”的下一步。

DataTemplate中的每个Button都包含一个ControlTemplate。

当命令的CanExecute为false时,此controlTemplate内的项目将被禁用。特别是在我下面的例子中,Button模板中的Button(带有图像的模板)也被禁用。

即使禁用与该按钮关联的命令,如何启用模板内的项目。

摘要:Button包含另一个按钮的模板。禁用父按钮的命令时,禁用模板内的按钮。

XAML:

<ListView.ItemTemplate>
    <DataTemplate>                
        <Button Name="nextButton" Height="30" Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Wiz:edited}}, Path=DataContext.ACommand}" CommandParameter="{Binding}">
              <Button.Template>
                <ControlTemplate>                     
                   <StackPanel Orientation="Horizontal">
                      <Label Content="{Binding}"/>
                      <Button>
                         <Button.Template>
                            <ControlTemplate>
                                <Image Source="{Binding source}"/>
                            </ControlTemplate>
                         </Button.Template>
                      </Button>
                   </StackPanel>
                </ControlTemplate>                    
              </Button.Template>
            </Button>
    </DataTemplate>
</ListView.ItemTemplate>

1 个答案:

答案 0 :(得分:0)

ButtonBase 挂钩与之关联的命令 CanExecute 。当CanExecute返回false时,ButtonBase缓存该值并从其 IsEnabledCore 返回false,从而禁用ButtonBase。禁用元素时,将禁用其后代。如果您不希望它被禁用,那么您不应该将它与命令相关联(例如,挂钩单击)或不使用CanExecute将为false的命令(例如,使用从其返回true的其他包装器命令CanExecute但不调用包装命令的执行)或者不在按钮内放置其他元素(创建/使用一些在单击列表项时将执行命令的附加行为)。