Silverlight Xaml 覆盖控件的 IsEnabled 属性

Silverlight Xaml Overriding IsEnabled Property of Control

我有一个 Silverlight 项目。在项目中我有一个 UserControl。此 UserControl 的 IsEnabled 是动态设置的,大部分时间设置为 false。

在这个 UserControl 中,我有几个嵌套的网格,所有网格都像往常一样从它们的父级 (UserControl) 继承 IsEnable。

但是,对于此 UserControl 中的其中一个网格,我不想继承此功能。我想始终将其设置为 True。有没有办法覆盖 IsEnabled 功能?

我试过的是,我用 ContentControl 包装并将 IsEnabled 设置为 True,但它不起作用。

<ContentControl IsEnabled="True">
  <ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto" Margin="0,0,0,0" BorderThickness="0">
    <HistoryControls:EditableMAMGridContainer StateInfo="{Binding Path=StateInfo, Source={StaticResource Evm}}" />
  </ScrollViewer>
</ContentControl>

根是这个 Scrollviewer 的 UserControl,它有几个父级和祖父级。它在很深的地方。

编辑: 此代码有效,但反之亦然无效

<UserControl IsEnabled="True">
   .
     .
        <ContentControl IsEnabled="False">
          ...

当 UserControl 设置为 False,而 contentControl 设置为 True(上述代码的相反情况)则不起作用。

首先:如果禁用父级,则所有子级都将被禁用。时期。你无法改变这一点,这实际上是一件好事。因为通过这种方式,您可以绝对确保可靠地阻止所有用户输入到 UI.

的整个子树。

不要试图扭曲框架的概念。这里的概念是:禁用绝对意味着不能有任何用户输入!在它的任何部分,不是那个子树的最小角落。

如果我们遵循这个概念,那么我们很快就会明白您实际上不希望您的父级被禁用,因为显然您希望它的一小部分仍然接收用户输入。所以 - 概念上 - 它没有被禁用!

现在如何进行技术翻译?

这意味着您必须以一种方式构建您的树,使您可以禁用它的一个分支,同时仍然启用一个兄弟分支。

例子

<TravelBooking>

    <!-- this will be disabled if we don't travel by plane -->
    <TransferToAirportPlanner/>
    <FlightToDestinationPlanner/>
    <ReturnFlightPlanner/>
    <TransferFromAirportPlanner/>

    <!-- this will always be enabled -->
    <HotelPlanner/>

</TravelBooking>

重组树以允许禁用子树

<TravelBooking>

    <!-- this will be disabled if we don't travel by plane -->
    <AirplaneTravelPlanningControl>
        <TransferToAirportPlanner/>
        <FlightToDestinationPlanner/>
        <ReturnFlightPlanner/>
        <TransferFromAirportPlanner/>
    </AirplaneTravelPlanningControl>

    <!-- this will always be enabled -->
    <HotelPlanner/>

</TravelBooking>

现在您可以轻松地禁用 AirplaneTravelPlanningControl 以禁用包含的子树。