我有一个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(与上述代码相反)则不起作用。
答案 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以禁用包含的子树。