2013-06-30 32 views
7

Tôi đang cố gắng hiển thị/ẩn các cột của một DataGrid thông qua menu ngữ cảnh. Tôi đã cố gắng sử dụng các ràng buộc cho nó, với XAML này:Khả năng hiển thị liên kết với mục menu có thể kiểm tra hiển thị lỗi "Nhà cung cấp dịch vụ đang thiếu dịch vụ INameResolver" trong WPF

<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> 

Tôi thậm chí đã thử nghiệm với các tùy chọn khác, chẳng hạn như BindsDirectlyToSource=TrueUpdateSourceTrigger=PropertyChanged. Tuy nhiên, các cột không thay đổi khả năng hiển thị của chúng khi tôi kiểm tra/bỏ chọn menuitems. Tôi đang làm gì sai? Điều này thực sự có thể có trong XAML thuần túy?

Trong câu hỏi this, câu trả lời sử dụng x:Reference. Tôi cũng đã thử điều đó nhưng đã nhận được lỗi

Nhà cung cấp dịch vụ thiếu dịch vụ INameResolver.

Google đã nói với tôi rằng đây là lỗi trong VS2010? Tôi có thể làm gì để giải quyết vấn đề này? Hay là cú sút tốt nhất của tôi để chuyển sang VS2012?

Trả lời

4

Dưới đây là lời giải thích từ Adam Nathan's WPF 4 unleashed book (Tôi khuyên tất cả mọi người để đọc):

x: mở rộng đánh dấu tham khảo thường nhầm lẫn liên quan đến việc XAML2009 tính năng mà chỉ có thể được sử dụng từ XAML lỏng lẻo tại thời điểm bài viết này. Mặc dù x: Tham chiếu là một tính năng mới trong WPF 4, nó có thể được sử dụng từ XAML2006 tốt miễn là dự án của bạn đang nhắm mục tiêu phiên bản 4 hoặc mới hơn của Khuôn khổ .NET. Một trục trặc là thiết kế XAML trong Visual Studio 2010 không xử lý đúng x: Tham chiếu, do đó, nó đưa ra lỗi thiết kế thời gian mà bạn có thể bỏ qua một cách an toàn: Nhà cung cấp dịch vụ thiếu dịch vụ INameResolver.

Trong mọi trường hợp, thông báo này có thể là bị bỏ qua. Đối với Visual Studio 2010 của tôi, đôi khi nó xuất hiện, đôi khi không.

EDIT:

tôi tìm thấy thêm một quote (source), nhưng họ không cung cấp các giải pháp cụ thể:

Khi sử dụng {x: Reference} là mục tiêu của một Label WPF, nhà thiết kế Visual Studio ném một ngoại lệ InvalidOperationException với thông báo "Nhà cung cấp dịch vụ thiếu dịch vụ INameResolver." Dự án sẽ biên dịch và thực thi mà không có bất kỳ vấn đề nào, nhưng khung Design, nơi x: Reference xuất hiện sẽ bị vô hiệu hóa vì ngoại lệ. Theo văn bản của cuốn sách này, đây là một vấn đề đã biết và cần được giải quyết trong tương lai.

Here, tác giả giải thích cụ thể vấn đề và viết gửi báo cáo lỗi tới 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>  
+0

cuốn sách đó hiện đang được bán ở đây. Tôi biết tôi nên đợi cho đến khi nó đến;) cảm ơn bạn! Tôi gặp vấn đề mà nhà thiết kế từ chối làm việc miễn là vấn đề không được giải quyết - bạn có thể xác nhận điều này và có thể đưa ra cách khắc phục điều đó không? – CBenni

+0

Tôi không nghĩ rằng đây là một vấn đề nghiêm trọng. 'Microsoft' không sửa lỗi và tệ hơn :). Nếu tôi không nhầm, họ thậm chí không nhận ra nó vì lỗi, vì vậy sửa chữa có thể chờ đợi một thời gian dài. Cá nhân tôi sử dụng 'x: Tham chiếu' trong các dự án và các vấn đề của họ không được quan sát. –

+1

Nó hiển thị thông báo "InvalidOperationException được ném vào 'Tham chiếu': Nhà cung cấp dịch vụ thiếu dịch vụ INameResolver. Nhấp vào đây để xem chi tiết." trong tab thiết kế. Tôi không thể sử dụng các nhà thiết kế ở tất cả, bởi vì nó bị vô hiệu hóa. Tôi sẽ xóa tham chiếu cho đến khi tôi hoàn thành dự án – CBenni

Các vấn đề liên quan