Silverlight Xaml重写控制的IsEnabled属性

时间:2016-05-25 09:43:01

标签: c# xaml silverlight user-controls

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

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

但是,对于此UserControl中的一个网格,我不想继承此功能。我想永远设置它。有没有办法覆盖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的root是UserControl,它有几个父母和祖父母。它是在非常深的。

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

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

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

1 个答案:

答案 0 :(得分:4)

首先:如果禁用父级,则禁用所有子级。期。你无法改变这一点,这实际上是一件好事。因为这样,您可以绝对确保可靠地阻止所有用户输入到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以禁用包含的子树。