Đặt thời gian thiết kế DataContext trên một cửa sổ có gây ra lỗi biên dịch không?


203

Tôi có XAML sau đây cho cửa sổ chính trong ứng dụng WPF của mình, tôi đang cố gắng đặt thời gian thiết kế d:DataContextbên dưới, tôi có thể thực hiện thành công cho tất cả các UserControls khác nhau của mình, nhưng nó gây ra lỗi này khi tôi cố gắng thực hiện cửa sổ ...

Error 1 The property 'DataContext' must be in the default namespace or in the element namespace 'http://schemas.microsoft.com/winfx/2006/xaml/presentation'. Line 8 Position 9. C:\dev\bplus\PMT\src\UI\MainWindow.xaml 8 9 UI

<Window x:Class="BenchmarkPlus.PMT.UI.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:UI="clr-namespace:BenchmarkPlus.PMT.UI"
    xmlns:Controls="clr-namespace:BenchmarkPlus.PMT.UI.Controls"
    d:DataContext="{d:DesignInstance Type=UI:MainViewModel, IsDesignTimeCreatable=True}"
    Title="MainWindow" Height="1000" Width="1600" Background="#FF7A7C82">

    <Grid>
        <!-- Content Here -->
    </grid>

</Window>

Câu trả lời:


263

Tôi cần thêm mc:Ignorable="d"thuộc tính vào thẻ Window. Chủ yếu tôi đã học được một cái gì đó mới. Các d:tiền tố namespace rằng Expression Blend / Visual Studio thiết kế thừa nhận là thực sự bỏ qua / "chú thích" bởi trình biên dịch thực / XAML phân tích cú pháp!

<Window 
...
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
...
/>

Sau đây được lấy từ

Nathan, Adam (2010-06-04). Giải phóng WPF 4 (Địa điểm Kindle 1799-1811). Sams. Phiên bản Kindle.

Tương thích đánh dấu

Không gian tên XML tương thích đánh dấu ( http://schemas.openxmlformats.org/markup-compabilities/2006 , thường được sử dụng với mctiền tố) chứa thuộc tính Ignitable hướng dẫn bộ xử lý XAML bỏ qua tất cả các thành phần / thuộc tính trong không gian tên được chỉ định nếu chúng không thể được giải quyết với các loại / thành viên .NET của họ. (Không gian tên cũng có thuộc tính ProcessContent ghi đè Ignitable cho các loại cụ thể bên trong các không gian tên bị bỏ qua.)

Expression Blend tận dụng tính năng này để thực hiện những việc như thêm thuộc tính thời gian thiết kế vào nội dung XAML có thể bị bỏ qua khi chạy.

mc:Ignorablecó thể được cung cấp một danh sách các không gian tên được phân tách bằng dấu cách và mc: ProcessContent có thể được cung cấp một danh sách các phần tử được phân tách bằng dấu cách. Khi XamlXmlReader gặp phải nội dung không thể giải quyết được, nó không báo cáo bất kỳ nút nào cho nội dung đó. Nếu nội dung có thể bỏ qua có thể được giải quyết, nó sẽ được báo cáo bình thường. Vì vậy, người tiêu dùng không cần phải làm gì đặc biệt để xử lý chính xác khả năng tương thích đánh dấu.


12
Tôi đã đập đầu vào điều này khá lâu. Có ý nghĩa nhưng có vẻ như là một sự giám sát quá lớn (các đối tượng dữ liệu thời gian thiết kế nên được hỗ trợ mà không cần tất cả các hack này)
Basic

3
Nếu bạn muốn bối cảnh dữ liệu có thể bỏ qua trong nút riêng của nó thay vì làm thuộc tính, hãy sử dụng <d: Window.DataContext />
ChéDon

Mẹo hay, đã giúp tôi phấn đấu với một ngoại lệ trình biên dịch lạ. Không có mc: ignitable, ngay cả khi tôi đặt d: DataContext, trình biên dịch XAML đã hiểu nó là cố gắng đặt DataContext và phàn nàn về việc sử dụng không gian tên xmlns sai.
Xé Aurstad

19

Ái chà, thật là đau! Hãy hy vọng MS đưa vào một số hỗ trợ thời gian thiết kế VS cho x: Bind.

Chúng tôi có thể sử dụng trình thiết kế VS nhưng cũng có thể dễ dàng chuyển sang x: Bind thay vì Binding. Đây là những gì tôi đã làm:

  • Trong Chế độ xem của tôi, tôi đã thêm một thuộc tính để nhận ViewModel của mình. Điều này có ý nghĩa vì các đường dẫn x: Bind có liên quan đến Trang (tức là đối tượng Xem).

  • Trong Trang XAML của tôi, tôi đã thêm phần sau <Page ... >vào đầu XAML:

    mc:Ignorable="d" 
    d:DataContext="{d:DesignInstance Type=local:MyView, IsDesignTimeCreatable=False}" 
    DataContext="{x:Bind}"
    

Theo cách này, bối cảnh dữ liệu thực tế của Trang được đặt thành chính Trang do {x:Bind}. Đó là vì x:Bindliên quan đến Trang và không có đường dẫn nào.

Đồng thời, do d:DataContextdòng, nhà thiết kế VS phản ánh về lớp MyView (không tạo một thể hiện) cho mục đích tương tác của nhà thiết kế VS. Điều này cho phép thiết kế VS từ MyView, nơi bạn có thể cuộn xuống thuộc tính ViewModel, mở rộng nó và chọn mục mà bạn muốn liên kết.

Khi bạn làm tất cả những điều đó, nhà thiết kế VS sẽ tạo ra một câu lệnh Binding có đường dẫn tương đối với Chế độ xem, nghĩa là nó xảy ra giống hệt như đường dẫn mà x: Bind mong đợi. Vì vậy, nếu bạn muốn chuyển sang x: Bind sau này, bạn có thể chỉ cần tìm kiếm và thay thế tất cả " {Binding" bằng " {x:Bind".

Tại sao chúng ta thậm chí cần d:DataContextdòng để nói với VS xem lớp nào? Câu hỏi hay, vì bạn sẽ nghĩ rằng VS có thể tìm ra dòng tiếp theo đặt DataContext cho Trang, bằng cách sử dụng DataContext={x:Bind}. Hãy tiếp tục và thử nó, nó không hoạt động và nó cũng không hoạt động nếu bạn thay đổi x: Bind thành Binding liên quan đến bản thân.

Hy vọng rằng tình trạng này sẽ được làm sạch bởi MS !!


3
WPF không hỗ trợ x: Bind; Câu trả lời này sẽ không hiệu quả với OP.
Byrel Mitchell
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.