将可见性绑定到可检查菜单项会在WPF中显示错误“服务提供程序缺少INameResolver服务”

时间:2013-06-30 15:54:50

标签: c# wpf

我试图通过上下文菜单显示/隐藏数据网格的列。我试图使用绑定,使用此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中实际可行吗?

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

  

服务提供商缺少INameResolver服务。

谷歌告诉我这是VS2010中的一个错误?我该怎么做才能解决这个问题?或者是我最好的切换到VS2012?

1 个答案:

答案 0 :(得分:4)

以下是Adam Nathan's WPF 4 unleashed book的解释(我建议所有人阅读):

  

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

在任何情况下,此消息都可以忽略。对于我的Visual Studio 2010,它有时会显示,有时则不会。

修改

我发现了另一个引用(source),但它们没有提供具体的解决方案:

  

当使用{x:Reference}作为WPF标签的目标时,Visual Studio设计器会抛出InvalidOperationException异常,并显示消息“服务提供程序缺少INameResolver服务”。该项目将编译和执行没有任何问题,但由于异常,将禁用出现x:Reference的设计画布。在本书撰写时,这是一个已知问题,应该在将来的某个时候解决。

Here,作者专门解释了问题,并写了将错误报告发送给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>