首页 文章

将MenuItem属性(IsEnabled)绑定到同一控件中的combobox属性(SelectedIndex)

提问于
浏览
2

我花了很多时间研究这个;我很好奇是否可以在XAML中完全进行简单绑定,而无需在后面的代码中实现INotifyPropertyChanged .

具有讽刺意味的是,在我研究过的时间里,我可以在代码中完成5次 .

我发现了一些建议使用DataTriggers的文章(对于MenuItems,DataTrigger必须位于样式触发器内) . 我试过这个,但没有错误就行不通 .

我怀疑DataTrigger由于MenuItem范围问题而找不到组合框,我在另一个线程中读到了这个问题 .

有人有什么建议吗?

代码:(没有构建或运行时错误,但属性未更新)

<ContextMenu>
<MenuItem Header="Do Something Neat" x:Name="MyMenuItem" Click="MyMenuItem_Click">
    <MenuItem.Style>
        <Style TargetType="{x:Type MenuItem}">
            <Style.Triggers>
                <Setter Property="IsEnabled" Value="True" />
                <DataTrigger Binding="{Binding ElementName=MyComboBox, Path=SelectedIndex}" Value="-1">
                    <Setter Property="IsEnabled" Value="False" />
                </DataTrigger>                                        
            </Style.Triggers>
        </Style>
    </MenuItem.Style>
</MenuItem>
</ContextMenu>

1 回答

  • 1

    我将默认的setter移到 Style.Triggers 之前(由于编译错误),将所有内容放入 Menu (以简化示例)并使其在索引 0 上触发(以更好地演示结果) . 以下作品:

    <Window x:Class="WpfApplication1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
        <DockPanel LastChildFill="False">
            <Menu Height="23" DockPanel.Dock="Top" >
                <MenuItem Header="Do Something Neat">
                    <MenuItem.Style>
                        <Style TargetType="{x:Type MenuItem}">
                            <Setter Property="IsEnabled" Value="True" />
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding ElementName=MyComboBox, Path=SelectedIndex}" Value="0">
                                    <Setter Property="IsEnabled" Value="False" />
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </MenuItem.Style>
                </MenuItem>
            </Menu>
            <ComboBox Name="MyComboBox" Height="23" Width="120" DockPanel.Dock="Top" >
                <ComboBoxItem >Index0</ComboBoxItem>
                <ComboBoxItem >Index1</ComboBoxItem>
            </ComboBox>
        </DockPanel>
    </Window>
    

相关问题