7

我正在尝试通过上下文菜单显示/隐藏数据网格的列。我试图通过这个 XAML 为它使用绑定:

<Grid>
    <DataGrid AutoGenerateColumns="False" Name="dataGrid1">
        <DataGrid.ContextMenu>
            <ContextMenu>
                <MenuItem Header="Show Column 1" IsCheckable="True" 
                    x:Name="showcol1" IsChecked="True" />
                <MenuItem Header="Show Column 2" IsCheckable="True"
                    x:Name="showcol2" IsChecked="False" />
            </ContextMenu>
        </DataGrid.ContextMenu>
        <DataGrid.Columns>
            <DataGridTextColumn Header="Col 0" />
            <DataGridTextColumn Header="Col 1" 
                Visibility="{Binding ElementName=showcol1, 
                Converter={StaticResource BooleanToVisibilityConverter},
                Path=IsChecked}" />
            <DataGridTextColumn Header="Col 2" 
                Visibility="{Binding ElementName=showcol2, 
                Converter={StaticResource BooleanToVisibilityConverter},
                Path=IsChecked}" />
        </DataGrid.Columns>
    </DataGrid>
</Grid>

我什至尝试了其他选项,例如BindsDirectlyToSource=TrueUpdateSourceTrigger=PropertyChanged。但是,当我选中/取消选中菜单项时,这些列不会改变它们的可见性。我究竟做错了什么?这在纯 XAML 中实际上可能吗?

这个问题中,答案使用x:Reference. 我也试过了,但收到错误

服务提供者缺少 INameResolver 服务。

谷歌告诉我这是VS2010的一个bug?我能做些什么来解决这个问题?还是我最好的办法是切换到 VS2012?

4

1 回答 1

5

以下是来自Adam Nathan's WPF 4 unleashed book(我建议大家阅读)的解释:

x:Reference 标记扩展经常被错误地与 XAML2009 功能相关联,这些功能在撰写本文时只能从松散的 XAML 中使用。尽管 x:Reference 是 WPF 4 中的一项新功能,但只要您的项目面向 .NET Framework 4 或更高版本,就可以从 XAML2006 使用它。一个小故障是 Visual Studio 2010 中的 XAML 设计器无法正确处理 x:Reference,因此它会提供以下设计时错误,您可以放心忽略:服务提供程序缺少 INameResolver 服务。

无论如何,可以忽略此消息。对于我的Visual Studio 2010,它有时会出现,有时不会。

编辑:

我又找到了一个引用(来源),但他们没有提供具体的解决方案:

使用 {x: Reference } 作为 WPF 标签的目标时,Visual Studio 设计器会引发 InvalidOperationException 异常,并显示消息“服务提供程序缺少 INameResolver 服务”。该项目将毫无问题地编译和执行,但出现 x: Reference 的设计画布将因异常而被禁用。在撰写本书时,这是一个已知问题,应该在未来的某个时间得到解决。

在这里,作者具体说明了问题,并写了将错误报告发送到Microsoft

BooleanToVisibilityConverter

<Window.Resources>
    <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
</Window.Resources>

DataGrid XAML

<DataGrid AutoGenerateColumns="False" Name="dataGrid1">
    <DataGrid.ContextMenu>
        <ContextMenu>
            <MenuItem x:Name="showcol1" Header="Show Column 1" IsCheckable="True" IsChecked="True" />
            <MenuItem x:Name="showcol2" Header="Show Column 2" IsCheckable="True" IsChecked="False" />
        </ContextMenu>
    </DataGrid.ContextMenu>

    <DataGrid.Columns>
        <DataGridTextColumn Header="Col 0" />

        <DataGridTextColumn Header="Col 1" Visibility="{Binding Source={x:Reference Name=showcol1}, Path=IsChecked, Converter={StaticResource BooleanToVisibilityConverter}}" />

        <DataGridTextColumn Header="Col 2" Visibility="{Binding Source={x:Reference Name=showcol2}, Path=IsChecked, Converter={StaticResource BooleanToVisibilityConverter}}" />
    </DataGrid.Columns>
</DataGrid>    
于 2013-06-30T16:17:26.683 回答