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];
}
}
Казалось бы, проблема в том, что мои 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