将可勾选菜单项的可见性绑定显示错误“服务提供程序缺少INameResolver服务”在WPF中。

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中是否可行?
this问题中,答案使用了x:Reference。我也尝试了,但是收到了错误信息:

服务提供程序缺少INameResolver服务。

谷歌告诉我这是VS2010的一个bug?我该怎么解决呢?或者我最好换成VS2012?
1个回答

5
以下是来自Adam Nathan的WPF 4 Unleashed书籍的解释(我建议每个人都阅读):
x:Reference标记扩展通常被错误地与仅能从松散XAML使用的XAML2009功能相关联。尽管x:Reference是WPF 4中的新功能,但只要您的项目针对.NET Framework的4或更高版本,它就可以很好地从XAML2006中使用。一个问题是Visual Studio 2010中的XAML设计器不能正确处理x:Reference,因此它会给出以下设计时错误,您可以安全地忽略: 服务提供程序缺少INameResolver服务。
在任何情况下,这条消息可以被忽略。对于我的Visual Studio 2010,它有时会出现,有时不会。
编辑:
我发现了另一句引文(source),但他们没有提供具体的解决方案:
当在WPF Label中使用{x:Reference}作为目标时,Visual Studio设计器会抛出InvalidOperationException异常,其中包含“服务提供程序缺少INameResolver服务”的消息。该项目将编译并执行而不会出现任何问题,但是由于异常,x:Reference出现的Design画布将被禁用。截至本书撰写时,这是一个已知问题,应在未来得到解决。 这里,作者专门解释了问题,并写道向Microsoft发送了错误报告。
BooleanToVisibilityConverter
<Window.Resources>
    <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
</Window.Resources>

数据网格 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>    

那本书正在运送到这里。我知道我应该等它到了再买的;)谢谢! 我的问题是设计师拒绝工作,除非问题得到解决 - 你可以确认一下,并给出解决方案吗? - CBenni
我认为这不是一个“严重”的问题。微软没有修正这个错误,甚至更糟糕 : )。如果我没记错的话,他们甚至没有承认这是一个错误,所以修复可能要等很长时间。我个人在他们的项目中使用x:Reference,并没有观察到任何问题。 - Anatoliy Nikolaev
1
在设计选项卡中显示消息“在'Reference'上引发了InvalidOperationException:服务提供程序缺少INameResolver服务。单击此处获取详细信息。” 我无法使用设计工具,因为它被禁用了。我将在完成项目之前删除该引用。 - CBenni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接