2013-10-10 108 views
2

我想知道如何從樣式設置自定義控件的屬性。從子設置父項屬性

我有一個自定義控件基於一個名爲'Substrate'的togglebutton,我有一個名爲'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:Substrate不是Int32的有效值」。

我在我的價值轉換器放置斷點,他們從來沒有觸發,所以我認爲問題是在別處。

我在做什麼錯?

+0

你提供整個控制模板?從我的角度來看,你的模板出了問題,因爲我什至看不到任何上下文菜單。 – Alezis

回答

3

由於您正在設置AncestorLevel = local:Substrate,而AncestorLevel期望Int32,所以出現錯誤。

此外,您無法按照自己的方式實現目標。即你不能對Setter的屬性進行綁定,因爲它不是DependancyProperty。你可以做的就是給你一個MenuItemName使用ControlTemplate.Trigger更新觸發的setter您的控件屬性:

<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