2013-10-10 6 views
2

Я хотел бы знать, как установить свойство настраиваемого элемента управления из стиля.Установка родительского свойства из дочернего объекта

У меня есть пользовательский элемент управления, основанный на togglebutton под названием «Субстрат», на котором у меня есть свойство dependency под названием «SubstrateState». Он принимает значение перечисления как значение.

В отдельном файле у меня есть стиль, который добавляет контекстное меню в элемент управления.

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

<Style TargetType="{x:Type local:Substrate}"> 
<Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="{x:Type local:Substrate}"> 
      <Grid> 
       <Grid.ContextMenu> 
        <ContextMenu Background="#212121"> 
         <MenuItem Header="Aborted"> 
          <MenuItem.Style> 
           <Style TargetType="MenuItem"> 
            <Style.Triggers> 
             <Trigger Property="IsPressed" 
                 Value="True"> 
              <Setter Property="{Binding SubstrateState, RelativeSource={RelativeSource AncestorLevel=local:Substrate}, Converter=converter:StringToSubstrateStatesConverter}" 
                  Value="Aborted" /> 
             </Trigger> 
            </Style.Triggers> 
           </Style> 
          </MenuItem.Style> 
         </MenuItem> 
        </ContextMenu> 
       </Grid.ContextMenu> 
      </Grid> 
     </ControlTemplate> 
    </Setter.Value> 
</Setter> 
</Style> 

Когда я запускаю это я получаю: «Обеспечить значение на„System.Windows.Baml2006.TypeConverterMarkupExtension“бросил исключение.»

Внутреннее исключение "local: Субстрат является недопустимым значением для Int32."

Я поставил точки останова в своем конверторе значений, и они никогда не запускают так, чтобы они думали, что проблема в другом месте.

Что я делаю неправильно?

+0

ли вы предоставить весь шаблон управления? С моей точки зрения что-то не так с вашим шаблоном, потому что я даже не вижу контекстного меню. – Alezis

ответ

3

Ошибка, которую вы получаете, поскольку вы устанавливаете AncestorLevel = local: субстрат, а AncestorLevel ожидает Int32.

Кроме того, вы не можете достичь этого так, как вы делаете. т. е. вы не можете сделать привязку к Property Setter, как вы делаете, поскольку это не DependancyProperty. Что вы можете сделать, это дать ваш MenuItemName и использовать ControlTemplate.Trigger обновить свойство элемента управления в инкубаторе триггера:

<Style TargetType="{x:Type local:Substrate}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type local:Substrate}"> 
        <Grid> 
        <Grid.ContextMenu> 
         <ContextMenu Background="#212121"> 
           <MenuItem x:Name="myMenuItem" Header="Aborted"> 
           </MenuItem> 
          </ContextMenu> 
         </Grid.ContextMenu> 
        </Grid> 
        <ControlTemplate.Triggers> 
         <Trigger SourceName="myMenuItem" Property="IsPressed" Value="true"> 
          <Setter Property="SubstrateState" Value="Aborted"></Setter> 
         </Trigger> 
        </ControlTemplate.Triggers> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
+0

Я сделал изменение, и ошибка исчезла. Однако свойство все еще не установлено. Я попытался добавить valueconverter, но все равно ничего. – user1029697

+0

Я попробовал это на своем конце, и это сработало ... это дает какие-либо ошибки привязки в окне вывода? – Nitin

+0

Ничего, я напишу небольшой проект без всяких накладных расходов и посмотрю, смогу ли я заставить его работать. Благодаря! – user1029697

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