Реализация Silverlight MVVM не отображает контент

1

EDIT: Проблема в том, что мои модели просмотра не были общедоступными, поэтому привязки не были найдены. По какой-то причине они должны быть общедоступными в Silverlight, хотя частные модели просмотра работают для WPF. Более подробно в моем ответе ниже.


Я пытаюсь реализовать MVVM приложение WPF в Silverlight, но я никогда не использовал Silverlight раньше. Я изо всех сил пытаюсь отобразить связанный контент. Я реализую его практически так же, как с WPF, за исключением того, что главный бит - это UserControl, а не Window, приложение размещено на веб-сайте, и мне пришлось удалить x:Type в DataTemplate DataType

Мой сайт-к-MainPage работает правильно, потому что я могу отображать текстовое поле или что-то на этой странице, однако привязка просто не отображается. Какие-либо предложения?

Мой MainPage.xaml.cs:

public partial class MainPage : UserControl
{
    private MainPageViewModel _viewModel;

    public MainPage()
    {
        InitializeComponent();

        _viewModel = new MainPageViewModel();
        this.DataContext = _viewModel;
    }
}

My MainPage.xaml:

<UserControl x:Class="TransformationServices.Silverlight.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="400"
    xmlns:view="clr-namespace:TransformationServices.Silverlight.View"
    xmlns:viewModel="clr-namespace:TransformationServices.Silverlight.ViewModel"
    xmlns:local="clr-namespace:TransformationServices.Silverlight"
    Background="#FF2D2D30">
    <UserControl.Resources>
    <local:ViewConverter x:Key="viewConverter"/>
        <DataTemplate DataType="viewModel:InputSelectViewModel">
            <TextBlock Text="Hello World!"/>
            <!-- This textblock is just for testing. It doesn't work, and neither does the following line-->
            <view:InputSelect/>
        </DataTemplate>
    </UserControl.Resources>
    <ContentControl Content="{Binding CurrentView}" />
</UserControl>

Мой MainPageViewModel.cs

class MainPageViewModel : ViewModelBase, INotifyPropertyChanged
{ 
    private ViewModelBase _currentView;

    private List<ViewModelBase> _viewModels;

    private int _viewIndex;

    public ViewModelBase CurrentView
    {
        get { return _currentView; }
        set
        {
            if (value != _currentView)
            {
                _currentView = value;
                OnPropertyChanged("CurrentView");
            }
        }
    }

    public MainPageViewModel()
    {
        _viewModels = new List<ViewModelBase>();

        // Add view models here
        _viewModels.Add(new InputSelectViewModel());

        _viewIndex = 0;
        CurrentView = _viewModels[_viewIndex];
    }
}
  • 1
    Это выглядит корректно, неявный DataTemplate должен отображаться. Так что может быть не так? Убедитесь, что вы работаете с Silverlight 5, а ваш браузер использует среду выполнения SL5, поскольку неявные шаблоны данных поддерживаются только с SL5. И еще одна вещь, которую вы можете попробовать обойти проблему: установить шаблон явно, просто чтобы увидеть, отображается ли он. Like ... <ContentControl ContentTemplate = "{StaticResource InputSelectTemplate}" ... />
Теги:
xaml
wpf
mvvm
silverlight

1 ответ

2
Лучший ответ

Казалось бы, проблема в том, что мои ViewModels не были общедоступными. Я заметил в выводе следующий тип сообщения:

System.Windows.Data Error: Cannot get '<Whatever property of View Model>' value ...

Это сообщение появилось для каждого свойства, к которому я привязывался, включая CurrentView. После того, как открыли модели просмотра, привязки работали отлично. Мне кажется странным, что Silverlight потребует, чтобы классы были общедоступными, когда они отлично работали как частные для WPF, но это мой первый опыт работы с Silverlight, так что эта сложность сбила меня с толку. Надеюсь, этот ответ может помочь кому-то в будущем. Во всяком случае, это основная причина того, почему привязки не работают, и поэтому CurrentView не показывался.

Еще одна причина, по которой мне было трудно отладить эту проблему, заключается в том, что моя страница случайно кэшировала все, поэтому некоторые из моих изменений не отображались. Эта ссылка помогла мне в этом:

http://www.codeproject.com/Articles/143414/Prevent-your-Silverlight-XAP-File-from-Caching-in

Ещё вопросы

Сообщество Overcoder
Наверх
Меню