Câu hỏi Ánh sáng MVVM “Loại không tìm thấy trong bộ nhớ cache”


Tôi đang cố gắng chuyển đổi ứng dụng Silverlight Windows Phone 8 của mình thành ứng dụng Điện thoại 8.1 như một phần của ứng dụng toàn cầu. Tôi không biết nếu đó là có liên quan bởi vì đây là lần đầu tiên tôi đã cố gắng thực hiện các mô hình xem một cách chính xác. Tôi muốn chia sẻ dữ liệu giữa các chế độ xem trong Windows và Windows Phone. Dù sao, đây là lỗi tôi nhận được.

Error   3   Type not found in cache: ScoreAlerts.ViewModel.FixturesViewModel.   C:\Users\Dave\Documents\Visual Studio 2012\Projects\Score Alerts\ScoreAlerts\ScoreAlerts.WindowsPhone\Pages\Fixtures.xaml   9   5   ScoreAlerts.WindowsPhone
Error   4   Type not found in cache: ScoreAlerts.ViewModel.HomePageViewModel.   C:\Users\Dave\Documents\Visual Studio 2012\Projects\Score Alerts\ScoreAlerts\ScoreAlerts.Shared\Pages\HomePage.xaml 34  9   ScoreAlerts.WindowsPhone

Đây là cách trình định vị mô hình chế độ xem của tôi

public class ViewModelLocator
{
    /// <summary>
    /// Initializes a new instance of the ViewModelLocator class.
    /// </summary>
    public ViewModelLocator()
    {
        if (!ViewModelBase.IsInDesignModeStatic)
        {
            ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);

            if (ViewModelBase.IsInDesignModeStatic)
            {
                // Create design time view services and models
                //SimpleIoc.Default.Register<IDataService, DesignDataService>();
            }
            else
            {
                // Create run time view services and models
                //SimpleIoc.Default.Register<IDataService, DataService>();
            }

            SimpleIoc.Default.Register<HomePageViewModel>();
            SimpleIoc.Default.Register<FixturesViewModel>();
        }
    }

    [SuppressMessage("Microsoft.Performance",
        "CA1822:MarkMembersAsStatic",
        Justification = "This non-static member is needed for data binding purposes.")]
    public HomePageViewModel Main
    {
        get
        {
            //return ServiceLocator.Current.GetInstance<HomePageViewModel>();
            return SimpleIoc.Default.GetInstance<HomePageViewModel>("default");
        }
    }

    [SuppressMessage("Microsoft.Performance",
        "CA1822:MarkMembersAsStatic",
        Justification = "This non-static member is needed for data binding purposes.")]
    public FixturesViewModel Fixtures
    {
        get
        {
            //return ServiceLocator.Current.GetInstance<FixturesViewModel>();
            return SimpleIoc.Default.GetInstance<FixturesViewModel>("default");
        }
    }

    public static void Cleanup()
    {
        // TODO Clear the ViewModels
    }
}

XAML của tôi có cái này

DataContext="{Binding Fixtures, Source={StaticResource Locator}}"

và ứng dụng của tôi có

<viewModel:ViewModelLocator x:Key="Locator"
                         d:IsDataSource="True"/>

Bất kỳ ý tưởng những gì tôi đang làm sai?


8
2018-05-11 10:15


gốc




Các câu trả lời:


Câu trả lời là một sai lầm khá đơn giản. Bit này không được thực hiện trong chế độ thiết kế

SimpleIoc.Default.Register<HomePageViewModel>();

Mã của tôi cho SimpleIoc.Default.Register (); bên trong một câu lệnh if chưa bao giờ được thực thi trong chế độ thiết kế.


12
2018-05-19 20:38



Ngay cả sau khi đăng ký lỗi vẫn tồn tại. - Sunil Kumar S C
Tương tự ở đây và tôi đã có hàng tá ViewModels khác đăng ký theo cùng một cách. Không hiểu tại sao cái này lại ném lỗi này. Điều kỳ lạ là nó là một cái trống rỗng và thừa kế từ cùng một lớp trừu tượng như những người khác. Bối rối. Bất cứ một đề nghị nào khác? - Thierry
Khi bạn nói một chút mã không được thực hiện trong chế độ thiết kế, bạn không nói cách bạn sửa nó? Bạn có thể giải thích? - Thierry
Mã của tôi cho SimpleIoc.Default.Register<HomePageViewModel>(); bên trong một câu lệnh if chưa bao giờ được thực thi trong chế độ thiết kế. Xem khối mã trong OP - Real World
Ôi chết tiệt! Giờ tìm kiếm điều này ... cảm ơn - Cabuxa.Mapache


Trong trường hợp của tôi, lớp đích không thực hiện một hàm tạo tham số-ít. Phương thức khởi tạo duy nhất mà lớp có chứa một tham số kiểu byte, vì vậy tôi đã nhận được:

Loại không tìm thấy trong bộ nhớ cache: System.Byte

Dòng đăng ký của tôi là như thế này:

SimpleIoc.Default.Register<IMyInterface, MyConcreteClass>();

Tôi đã thêm một hàm tạo ít tham số vào MyConcreteClass và sau đó áp dụng [PreferredConstructor] thuộc tính cho nó (thuộc tính này có sẵn trong GalaSoft.MvvmLight.Ioc không gian tên) và đã loại bỏ vấn đề.

Hy vọng điều này sẽ giúp ai đó xuống đường.


0
2018-03-14 18:30