我有一个listView,其中每个项目由一个包含按钮的dataTemplate组成。这是由于一个需求,点击列表项将像点击按钮一样移动到"向导"的下一步。
DataTemplate中的每个Button都包含一个ControlTemplate。
当命令的CanExecute为false时,这个controlTemplate中的项将被禁用。特别是在我下面的例子中,按钮的模板里面的按钮(一个图像作为它的模板)也被禁用了。
如何在与该按钮关联的命令被禁用时保持模板内的项启用
Summary: 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>
ButtonBase钩子CanExecute与之关联的命令。当CanExecute返回false时,ButtonBase缓存它并从它的IsEnabledCore返回false,从而禁用ButtonBase。当一个元素被禁用时,它的后代也被禁用。如果你不希望它被禁用,那么你要么不应该将它与命令相关联(例如,钩子点击),要么不使用CanExecute为false的命令(例如,使用一个不同的包装器命令,从CanExecute返回true,但不调用包装命令的Execute),或者不把其他元素放在按钮内(创建/使用一些附加的行为,当列表项被点击时将执行命令)。