2012-09-19 26 views
5

Tôi đang bắt đầu một dự án mới và định hướng dự án của tôi trên cấu trúc được đề xuất trong this question.Chế độ xem không tìm thấy ViewModel trong các Hội đồng khác nhau

Bây giờ tôi thấy có hành vi lạ. Khi tôi thiết lập datacontext trong View-XAML, nó không được tìm thấy trong thời gian chạy (nhận được XamlParseException). Khi tôi đặt nó trong hàm tạo trong tệp codebehind, mọi thứ đều hoạt động tốt.

Hành vi chính thức (có tài liệu) này khi sử dụng các hội đồng khác nhau hay tôi đang làm điều gì đó sai?

Mã:

Không làm việc:

MainView.xaml:

<UserControl x:Class="ViewsRoot.Views.MainView"    
     xmlns:baseControls="clr-namespace:BaseControls;assembly=BaseControls"    
     xmlns:viewModels="clr-namespace:ViewModelsRoot;assembly=ViewModelsRoot"> 
<UserControl.DataContext> 
    <viewModels:ShellViewModel /> 
</UserControl.DataContext> 

MainView.xaml.cs

public MainView() 
{ 
    InitializeComponent(); 
    // No DataContext set in codebehind-file  
} 

làm việc:

MainView.xaml:

<UserControl x:Class="ViewsRoot.Views.MainView"    
     xmlns:baseControls="clr-namespace:BaseControls;assembly=BaseControls"    
     xmlns:viewModels="clr-namespace:ViewModelsRoot;assembly=ViewModelsRoot"> 
<!--<UserControl.DataContext> 
    <viewModels:ShellViewModel /> 
</UserControl.DataContext> --> 

MainView.xaml.cs:

public MainView() 
{ 
    InitializeComponent(); 
    DataContext = new ViewModelsRoot.ShellViewModel(); 
} 

Cập nhật:

Các ngoại lệ-Text là:

{ "Các tập tin hoặc lắp ráp \ "ViewModelsRoot, PublicKeyToken = null \" hoặc một trong các phụ thuộc của nó không được tìm thấy. Hệ thống không thể tìm thấy các tập tin định "}

Và ngoại lệ bên trong duy nhất tôi có thể thấy là một System.IO.FileNotFoundException

Cập nhật 2:..

Cám ơn ý kiến, nhưng tôi thiên đường Tôi đã rút ngắn nó ở đây để hiển thị mã, nhưng tôi tăng gấp đôi và triplechecked (một lần nữa) .Không gian tên DataContexts cũng được điền vào bởi intellisense.Phạm vi toàn bộ <viewModels:ShellViewModel /> được viết bởi intelli-sense. Vì vậy, nó được tìm thấy tại designtime ... ... để có thêm ý tưởng nào?

Cập nhật 3: Xaml được phân tích cú pháp "đúng" khi tôi có thể liên kết DataContext với một lớp trong cùng một assembly.

+0

Có ngoại lệ nào bên trong không? – Guillaume

+0

@Guillaume vui lòng xem câu hỏi đã cập nhật của tôi :) – basti

+0

Bạn có thể đã quên một số không gian tên trong 'UserControl' của mình. Kiểm tra xem điều này có hữu ích không: http://stackoverflow.com/questions/8852912/xamlparseexception-in-view – Guillaume

Trả lời

-1

Tôi thường tìm thấy lỗi này khi khung mục tiêu dự án được đặt thành "Hồ sơ khách hàng" (điều này được đặt theo mặc định trên VS2010, IIRC), nếu trường hợp này xảy ra, hãy thử thay đổi thành 3.5 hoặc 4.0.

+0

Xin lỗi. Không may mắn - đó là .net4-Full Profile. – basti

+0

Bất kỳ cơ hội nào bạn có thể tải lên dự án của mình để tôi có thể xem? –

2

tôi đã sao chép lỗi này sử dụng một giải pháp dự án cây, với sự phụ thuộc quy định giữa họ:

  • StartupProject → ViewsRoot
  • ViewsRoot → ViewModelsRoot
  • ViewModelsRoot

"StartupProject" có loại đầu ra "exe", trong khi hai loại kia có "dll".

Trong trường hợp của tôi, tôi đã giải quyết được sự cố bằng cách thêm "ViewModelsRoot" vào danh sách Tham khảo "StartupProject". Nó không phải là một vấn đề mã hóa, mà là một vấn đề thời gian chạy, bởi vì "ViewModelsRoot.dll" không được sao chép vào thư mục đầu ra "StartupProject".

Khi bạn chỉ định DataContext trong mã-đằng sau, Visual Studio thông báo sự cần thiết cho rằng "dll" và thêm nó vào đầu ra sau khi biên dịch. Điều này không xảy ra khi thiết lập DataContext từ XAML. Đó là khó khăn bởi vì "ViewModelsRoot" lắp ráp được giải quyết gián tiếp thông qua "ViewsRoot" tại thời gian chạy. Thêm nó vào danh sách tham khảo lực lượng Visual Studio để sao chép "dll" trong cả hai trường hợp.

Bạn cũng có thể sao chép "ViewModelsRoot.dll" vào thư mục đầu ra trực tiếp, nhưng nó sẽ không được cập nhật khi bạn thay đổi mã.

+0

Điều này thật thú vị. Tôi đã có cùng một vấn đề và giải quyết nó với sửa chữa này nhưng với tôi đó là một sửa chữa bẩn. Tôi không muốn có tham chiếu đó trong dự án khởi động của mình và tôi muốn các dự án của mình độc lập. Tôi nhận thấy điều này không bao giờ xảy ra với tôi trong quá khứ nhưng trong quá khứ tôi luôn có một số tham chiếu mã hóa cho một ViewModel. Vì vậy ... Một hack ít rõ ràng hơn là chỉ cần thêm một lớp riêng vào dự án Views của bạn và gọi nó là bất cứ điều gì bạn muốn và chỉ cần thêm một trường vào ViewModel trong dự án ViewModel. Nó thậm chí không cần phải được khởi tạo, chỉ có để tham khảo. –

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