2015-10-28 59 views
0

我想創建一個通用模板,我可以使用綁定父屬性來設置幾個屬性。無法觸發Menuitem.icon圖像綁定上的DataTrigger

這裏是代碼:

<MenuItem Header="Item 1 " 
 
      IsEnabled="false"> 
 
      <MenuItem.Icon> 
 
          <Image Source="{StaticResource MyImage}" Width="20" > 
 
           <Image.Style> 
 
            <Style TargetType="Image"> 
 
             <Style.Triggers> 
 
              <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=MenuItem, AncestorLevel=2}, Path=IsEnabled}" Value="false"> 
 
               <Setter Property="Effect" Value="{StaticResource GrayScaleEffect}"/> 
 
              </DataTrigger> 
 
              <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=MenuItem, AncestorLevel=2}, Path=IsEnabled}" Value="true"> 
 
               <Setter Property="Effect" Value="{x:Null}"/> 
 
              </DataTrigger> 
 
             </Style.Triggers> 
 
            </Style> 
 
           </Image.Style> 
 
          </Image> 
 
      </MenuItem.Icon> 
 
      </MenuItem>

問題我面對的是下面的代碼時,菜單項的IsEnable屬性設置爲false,沒有被觸發。

<DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=MenuItem, AncestorLevel=2}, Path=IsEnabled}" Value="false"> 
 
               <Setter Property="Effect" Value="{StaticResource GrayScaleEffect}"/> 
 
              </DataTrigger>

我也試過TemplatedParent,TemplateBinding但沒有工作過。我將不勝感激任何幫助。

+0

。 https://msdn.microsoft.com/en-us/library/ms747082(v=vs.90).aspx – tgpdyk

+0

我能想到的最短解決方案是使用來自VM的屬性 \t \t \t <圖像源= 「{StaticResource的MYIMAGE}」 WIDTH = 「20」> \t \t \t \t \t \t \t <形式的TargetType = 「圖像」> \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t user1414925

+0

它工作嗎?作爲替代方案,您可以刪除菜單,但使用Listbox或ListView並將其託管在Popup中。 – tgpdyk

回答

0

問題是錯誤的AncestorLevel值,您應該將其更改爲1。 AncestorLevel參數是可選參數,如果沒有其他MenuItem更高級別的對象,則可以將其刪除。

+0

我已經用''進行了測試。所以'GrayScaleEffect'可能還有其他問題。 – bars222

0

這裏是爲我工作的解決方案:你需要重寫菜單項的默認模板

<Style x:Key="GrayScaleStyle" TargetType="Image"> 
<Style.Triggers> 
    <DataTrigger Binding="{Binding Path=IsEnabled, RelativeSource={RelativeSource Self }}" Value="true"> 
     <Setter Property="Image.Effect" Value="{StaticResource GrayscaleEffect}"/> 
     <Setter Property="Opacity" Value="0.1"/> 
    </DataTrigger> 
</Style.Triggers> 

<MenuItem Header="Grayout effect" IsEnabled="False" > 
<MenuItem.Icon> 
    <Image Source="{StaticResource MyImage}" Width="20" IsEnabled="{Binding Path=., RelativeSource={RelativeSource TemplatedParent}}" Style="{StaticResource GrayScaleStyle}"/> 
</MenuItem.Icon>