2012-01-14 2 views
1

Я пытаюсь использовать Prism (только для CompositeUI) и MVVM Light Toolkit (для MVVM architecture = D), но я получаю некоторые проблемы с Light ViewModelLocator. Когда мы используем локатор в «простое» приложение WPF, мы можем использовать ресурс приложения на App.xaml, как это:Призма и MVVM Light Toolkit

<Application.Resources> 
    <vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" /> 
</Application.Resources> 

Но когда мы используем Prism, наш бизнес код находится внутри проекта модуля , и он не имеет app.xaml, то я пытался поставить этот ресурс внутри вида ресурсов:

<Window.Resources> 
    <ResourceDictionary> 
     <vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" /> 
    </ResourceDictionary> 
</Window.Resources> 

это просто выключил режим Design (а также выполнения) ошибок, но View Безразлично» t появляется в области, назначенной ему.

Кто-то уже пытался сделать что-то вроде этого? Можно ли подключить Prism и MVVM Light вместе?

Это мой "полный" код:

(ViewLight.xaml)

<Window x:Class="TryERP2.Financeiro.View.ViewLight" 
    ... a lot of NS ... 
    mc:Ignorable="d" 
    xmlns:vm="clr-namespace:TryERP2.Financeiro.ViewModel" 
    d:DesignHeight="150" d:DesignWidth="245" SizeToContent="WidthAndHeight"> 
    <Window.Resources> 
     <ResourceDictionary> 
      <vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" /> 
     </ResourceDictionary> 
    </Window.Resources> 

    <Grid DataContext="{Binding Light, Source={StaticResource Locator}}"> 
     <Button Content="{Binding MyButtonText}" HorizontalAlignment="Stretch" Name="button1" VerticalAlignment="Stretch" /> 
    </Grid> 
</Window> 

ViewLightModel.cs:

public class ViewLightModel : ViewModelBase 
{ 
    public ViewLightModel() 
    { } 

    public const string MyButtonTextPropertyName = "MyButtonText"; 
    private string _myButtonText = "Button Text"; 

    public string MyButtonText 
    { 
     get 
     { return _myButtonText; } 

     set 
     { 
      if (_myButtonText == value) 
      { return; } 

      _myButtonText = value; 
      RaisePropertyChanged(MyButtonTextPropertyName); 
     } 
    } 
} 

Financeiro.cs (Класс модуля инициализатор ... Частично показано ... Только там, где я регистрирую и «вызываю» виды):

 var container = ServiceLocator.Current.GetInstance<IUnityContainer>(); 
     container.RegisterType<Object, ViewLight>("ViewLight"); 

     var regionManager = ServiceLocator.Current.GetInstance<IRegionManager>(); 
     var main = new Uri("ViewLight", UriKind.Relative); 
     regionManager.RequestNavigate("Desktop", main); 

«Обычное» приложение MVVM Light имеет файл App.xaml, который (я думаю) не используется в модулях Prism Views. Этот файл имеет следующую структуру:

<Application x:Class="TryERP2.Financeiro.App" 
     ... a lot of NS ... 
     xmlns:vm="clr-namespace:TryERP2.Financeiro.ViewModel" 
     StartupUri="MainWindow.xaml" 
     mc:Ignorable="d"> 

    <Application.Resources> 
     <vm:ViewModelLocator x:Key="Locator" 
          d:IsDataSource="True" /> 
    </Application.Resources> 

</Application> 

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

http://imageshack.us/photo/my-images/818/capturarwy.png

Когда я пытаюсь изменить эту точку зрения и поставить на его место «простой вид» (не используя MVVMLight) она прекрасно работает, как показано на рисунке:

http://imageshack.us/photo/my-images/513/capturar1a.png

+0

Какой контейнер вы используете? MEF или Unity? Можете ли вы опубликовать код для вашего вида codebehind и ViewModel codebehind? Кроме того, код о том, как вы вводите V-VM в регион. MVVMLight, данные проектирования и т. Д. - это отдельные проблемы, с которыми вы работаете в PRISM/Silverlight. Просмотр не отображается, скорее всего, ошибка композиции – katit

+0

Я использую Unity. Я опубликую весь код, отредактировав вопрос. –

+0

В представлении отсутствует код, кроме кода по умолчанию. Считаете ли вы, что объясненный скриншот запускающего приложения будет полезен? –

ответ

0

Извините. Я совершил большую ошибку. Как вы, возможно, заметили, я создаю приложение для ленты, и я пытаюсь показать элементы управления под пустым регионом. Элементы, которые могут отображаться там, являются элементами управления.Это не работает, потому что я пытался отобразить окно:

<Window x:Class="TryERP2.Financeiro.View.ViewLight" 
... a lot of NS ... 
mc:Ignorable="d" 
xmlns:vm="clr-namespace:TryERP2.Financeiro.ViewModel" 
d:DesignHeight="150" d:DesignWidth="245" SizeToContent="WidthAndHeight"> 
... etc 

Я установил ее, изменив его в пользовательский элемент управления, а не в окно, и она работала отлично.

Моих новые ViewLight.xaml:

<UserControl x:Class="TryERP2.Financeiro.View.ViewLight" 
     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" 
     xmlns:vm="clr-namespace:TryERP2.Financeiro.ViewModel" 

     d:DesignHeight="150" d:DesignWidth="245"> 
    <UserControl.Resources> 
     <vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" /> 
    </UserControl.Resources> 

    <Grid DataContext="{Binding Light, Source={StaticResource Locator}}"> 
     <Button Content="{Binding MyButtonText}" HorizontalAlignment="Stretch" Name="button1" VerticalAlignment="Stretch" /> 
    </Grid> 
</UserControl> 

Моего новый ViewLight.xaml.cs (Code-за):

public partial class ViewLight : UserControl 
{ 
    public ViewLight() 
    { 
     InitializeComponent(); 
    } 
} 

И ViewModel все то же.

0

в ViewLight.xaml вы должны изменить

<Window.Resources> 
    <ResourceDictionary> 
     <vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" /> 
    </ResourceDictionary> 
</Window.Resources> 

к

<Window.Resources> 
     <vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" /> 
</Window.Resources> 

Потому что Window.Resources уже ResourceDictionary, и вы создаете другой в нем. Вы не можете получить доступ к ресурсу Locator здесь:

<Grid DataContext="{Binding Light, Source={StaticResource Locator}}"> 

Другой вариант - использовать MergedDictionary.

+0

Привет ... Я уже пытался удалить тег , но это не повлияло. Что касается привязки, я просто изменил его на тег , потому что я получал сообщение об ошибке. Исходным местоположением свойства DataContext был тег . –

+0

Когда это было в теге Window, я получил это сообщение об ошибке: «Не удается найти ресурс с именем« Locator ». Имена ресурсов чувствительны к регистру.». Он работал над простым приложением MvvmLight, где ресурс находился в теге . –

+0

какая у вас ошибка? проверьте выходные данные в режиме vs (в режиме отладки), чтобы зафиксировать ошибки привязки. –