绑定到样式中的元素名称

时间:2014-10-15 16:09:00

标签: wpf binding styles

我有一个应用程序,它有一个按钮的上下文菜单下拉菜单。下拉菜单使用按钮上的样式实现。我希望能够根据列表视图中的文件数启用或禁用上下文菜单中的特定项。我为此工作的转换器工作正常(我可以将它附加到一个没有样式的按钮,它启用或禁用它就好了),但是当我将它附加到上下文菜单项时,它失败了。我确定这是因为Binding无法找到我所指的元素,因为它在风格中,但我不确定如何将其指向正确的方向。

<Button Name="buttonDropDown" BorderBrush="LightGray" BorderThickness="0,1,0,0" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" Padding="2,0" >
    <Button.Style>
        <Style TargetType="{x:Type Button}">
            <Style.Triggers>
                <EventTrigger RoutedEvent="Click">
                    <EventTrigger.Actions>
                        <BeginStoryboard>
                            <Storyboard>
                                <BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="ContextMenu.IsOpen">
                                    <DiscreteBooleanKeyFrame KeyTime="0:0:0" Value="True"/>
                                </BooleanAnimationUsingKeyFrames>
                            </Storyboard>
                        </BeginStoryboard>
                    </EventTrigger.Actions>
                </EventTrigger>
            </Style.Triggers>
            <Setter Property="ContextMenu">
                <Setter.Value>
                    <ContextMenu>
                        <MenuItem Header="Option 1">
                            <MenuItem.Style>
                                <Style TargetType="MenuItem">
                                    <EventSetter Event="Click" Handler="opt1_Click"/>
                                </Style>
                            </MenuItem.Style>
                        </MenuItem>
                        <MenuItem Header="Option 2">
                            <MenuItem.Style>
                                <Style TargetType="MenuItem">
                                    <EventSetter Event="Click" Handler="opt2_Click"/>
                                </Style>
                            </MenuItem.Style>
                        </MenuItem>
                        <MenuItem Header="Option 3" IsEnabled="{Binding ElementName=fileListView, Path=Items.Count, Converter={StaticResource fileCountConverter}}">
                            <MenuItem.Style>
                                <Style TargetType="MenuItem">
                                    <EventSetter Event="Click" Handler="opt3_Click" IsEnable="{Binding ElementName=fileListView, Path=Items.Count, Converter={StaticResource fileCountConverter}}"/>
                                </Style>
                            </MenuItem.Style>
                        </MenuItem>
                    </ContextMenu>
                </Setter.Value>
            </Setter>
            <Setter Property="Background" Value="Transparent"/>
            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
            <Setter Property="HorizontalContentAlignment" Value="Center"/>
            <Setter Property="VerticalContentAlignment" Value="Center"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type Button}">
                        <Grid x:Name="Chrome" Background="{TemplateBinding Background}" SnapsToDevicePixels="true">
                            <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                        </Grid>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter Property="Background" Value="#FFc2e0ff"/>
                                <Setter Property="BorderBrush" Value="#FF3399ff"/>
                                <Setter Property="BorderThickness" Value="2"/>
                            </Trigger>
                            <Trigger Property="IsPressed" Value="True">
                                <Setter Property="Background" Value="#FFc2e0ff" />
                                <Setter Property="BorderBrush" Value="#FF3399ff"/>
                                <Setter Property="BorderThickness" Value="2"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Button.Style>

转换器仅供参考:

class FileCountConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        int count = (int)value;
        if (count == 1)
            return true;
        else
            return false;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

0 个答案:

没有答案