MenuItem.Icon没有使用DataTrigger显示灰色

时间:2011-07-07 09:16:53

标签: c# wpf

如果禁用了menuitem(只是一个灰色的版本),我尝试将另一个图像显示为menuitem.icon。这就是我试过的:

<tk:DataGrid.ContextMenu>
<ContextMenu>
    <MenuItem Header="_Divorce" Command="{Binding Path=DivorceCommand}">
        <MenuItem.Icon>
            <Image>
                <Image.Style>
                    <Style>
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding Path=IsEnabled, RelativeSource={RelativeSource FindAncestor, AncestorType=MenuItem, AncestorLevel=3}}" Value="true">
                                <Setter Property="Image.Source" Value="eraser.ico" />
                            </DataTrigger>
                            <DataTrigger Binding="{Binding Path=IsEnabled, RelativeSource={RelativeSource FindAncestor, AncestorType=MenuItem, AncestorLevel=3}}" Value="false"
                                <Setter Property="Image.Source" Value="eraser_grey.ico" />
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </Image.Style>
            </Image>   
        </MenuItem.Icon>  
    </MenuItem>
</ContextMenu>  
</tk:DataGrid.ContextMenu>
</tk:DataGrid>

错误讯息:

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.MenuItem', AncestorLevel='1''. BindingExpression:Path=IsEnabled; DataItem=null; target element is 'Image' (Name=''); target property is 'NoTarget' (type 'Object')

我目前的XAML数据触发器绑定有什么问题?

我感谢任何帮助!

2 个答案:

答案 0 :(得分:2)

您可以尝试以下方法:

添加类似CubaLibre mentioned

的触发器

但不是使用目标名称,而是无效。使用以下内容。

<Trigger Property="IsEnabled" Value="False">
   <Setter TargetName="Image">
       <Setter.Value>
            <Image Source="eraser_grey.ico"/>
       </Setter.Value>
   </Setter>
</Trigger>

如果这不起作用(抱歉现在不能为自己测试)。你也可以这么做:

为menuitem创建一个样式,你可以完全复制original style 现在,在所需角色模板的控件模板中,您只需在ControlTemplate.Triggers下添加。你的触发器如

<Trigger Property="IsEnabled" Value="False">
  <Setter Property="Source" Value="eraser_grey.ico"/>
</Trigger>

使它更清洁一点。我将添加一个服务类,其中包含一个名为“DisabledIcon”或类似的附加属性,并将其用作值,而不是硬编码的。

不幸的是,改变整个风格是我现在能想到的唯一工作方式。

[编辑]

在进行了一些进一步调查之后,这是一个很好的解决方案,即使我对它不满意因为它很安静丑陋:(但对不起,我现在没有更好的想法。

<MenuItem Header="_Divorce" Command="...">
    <MenuItem.Icon>
        <ContentControl>
            <ContentControl.ContentTemplate>
                <DataTemplate>
                    <Image x:Name="iconImage" Source="arrowDown.png"/>
                    <DataTemplate.Triggers>
                        <DataTrigger Binding="{Binding IsEnabled, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type MenuItem}}}" Value="False">
                            <Setter TargetName="iconImage" Property="Source" Value="close.png"/>
                        </DataTrigger>
                    </DataTemplate.Triggers>
                </DataTemplate>
            </ContentControl.ContentTemplate>
        </ContentControl>
    </MenuItem.Icon>
</MenuItem>

答案 1 :(得分:0)

<Trigger Property="IsEnabled" Value="False">
   <Setter Property="Source" TargetName="Image" Value="eraser_grey.ico"/>
</Trigger>

尝试这样做时是否有效