2016-05-25 6 views
0

У меня есть проект Silverlight. В проекте у меня есть UserControl. IsEnabled для этого UserControl задается динамически, и большую часть времени он имеет значение false.Silverlight Xaml Overriding IsEnabled Свойство управления

В этом UserControl у меня есть несколько вложенных сеток, и все сетки наследуют IsEnable от их родителя (UserControl), как обычно.

Однако для одной из сетей внутри этого 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> 

Корень является UserControl для этого Scrollviewer и имеет несколько родителей и дедушек и бабушек. Это очень глубоко.

EDIT: Этот код работает, но наоборот не работает

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

когда UserControl устанавливает значение False, и ContentControl устанавливает True (противоположный случай приведенный выше код), то не работает.

+1

Какова цель этого? Знаете ли вы, что включение родительского контроля блокирует все сообщения для дочерних элементов управления, чтобы они не могли реагировать на какой-либо вход? Возможно, вы можете достичь требуемого состояния? Как создание состояния «заблокировано», когда родительский контроль выглядит как отключенный? – lerthe61

+0

Да, я знаю, во время выполнения, в соответствии с некоторыми условиями, мне нужно отключить. однако для datagrid я хочу, чтобы он включал все время, не зависящее от этого userControl. – Creed

ответ

3

Прежде всего: если вы отключите родителя, все дети будут отключены. Период. Вы не можете изменить это, и на самом деле это хорошо. Потому что таким образом вы можете быть абсолютно уверены, чтобы надежно блокировать все входные данные пользователя ко всему поддереву пользовательского интерфейса.

Не пытайтесь сгибать концепции каркаса. Концепция здесь: отключена абсолютно означает, что не может быть никакого пользовательского ввода! Ни в коем случае, это не самый маленький угол этого поддерева.

Если мы будем следовать этой концепции, то нам станет ясно, что вы действительно не хотите, чтобы ваш родитель был отключен, потому что, очевидно, вы хотите, чтобы небольшая его часть все еще получала пользовательский ввод. Так что -конкретно - он не отключен!

Теперь, как перевести это технически?

Это означает, что вам нужно будет структурировать дерево таким образом, чтобы вы могли отключить одну ветвь его, в то же время все еще можно включить ветку сиблинга.

Пример

<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 отключить содержащийся поддерево.

+0

Благодарим вас за хорошее объяснение. Я думаю, вы правы.Но у меня много детей, только из-за одного другого поведения ребенка, следует ли добавить IsEnabled ко всем детям или всем членам дерева? Это то, что я понимаю из вашего ответа. – Creed

+0

добавил пример, надеюсь, что это поможет. – Martin

Смежные вопросы