2017-06-15 5 views
1

MVVM-LightでTemplateStudioを使用してUWPアプリケーションを作成しましたが、Visual Studio(またはBlend)で表示するデザインデータを取得できません。デザインモードのデータがMVVM-Lightで表示されない

ビューモデルロケータは:

public class ViewModelLocator 
{ 
    NavigationServiceEx _navigationService = new NavigationServiceEx(); 

    public ViewModelLocator() 
    { 
     ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default); 

     if(ViewModelBase.IsInDesignModeStatic) 
     { 
      SimpleIoc.Default.Register<IFooProvider, DesignFooProvider>(); 
     } 
     else 
     { 
      SimpleIoc.Default.Register<IFooProvider, FooProvider>(); 
     } 

     SimpleIoc.Default.Register(() => _navigationService); 
     SimpleIoc.Default.Register<ShellViewModel>(); 
     Register<MainViewModel, MainPage>(); 
     Register<FooViewModel, FooView>(); 

     _navigationService.SetMainViewModel(MainViewModel); 
    } 

    public MainViewModel MainViewModel => ServiceLocator.Current.GetInstance<MainViewModel>(); 

    public ShellViewModel ShellViewModel => ServiceLocator.Current.GetInstance<ShellViewModel>(); 

    public FooViewModel FooViewModel => ServiceLocator.Current.GetInstance<FooViewModel>(); 

    public void Register<VM, V>() where VM : class 
    { 
     SimpleIoc.Default.Register<VM>(); 
     _navigationService.Configure(typeof(VM).FullName, typeof(V)); 
    } 
} 

FooViewModelがFooView.xamlににバインドされているのObservableCollectionを持って

私は実際のコードを実行するとすべてが正常に動作し、私のFooViewModelが正しくからデータが読み込まれますFooProvider。

Visual StudioまたはBlendでもFooViewを見ると、FooView.xamlのListBoxにデータは表示されません。

設計時に何がうまくいかないのかをデバッグする方法はありますか?デザイン時にFooViewにデータを正しく表示するためにロケータを修正するにはどうすればよいですか?

(注:上記のクラスに追加した唯一のコードはFooViewの関連項目に関連していましたが、他のコードはあらかじめ用意されていました)。

答えて

3

設計時に間違っていることをデバッグする方法はありますか?

可能です。ここで手順は次のとおりです。

  1. は、あなたのタスクマネージャを開きXDesProc.exeを見つけると詳細からそのPIDを記録し、コンストラクタコードまたはあなたが
  2. を確認したい任意のコードに
  3. セットブレークポイントをタップ
  4. Blendからアプリを開き、2番目のXDesProc.exeを探して、そのPIDを記録してください。
  5. FooViewのページを閉じてください。
  6. Visual Studioで[デバッグ] - > [プロセスにアタッチ]を選択し、管理対象(v4.6、v4.5、v4.0)のコードを選択し、XDesProc.exeのブレンドPIDを選択します。
  7. ブレンドに戻るデザインデータの問題を表示するページを開きます。
  8. Visual Studioは、必要なブレークポイントでブレークします。

ところで、あなたのコードはありませんので、私があなたの問題を再現したかどうかはわかりません。デバッグ後、私たちの情報をデバッグすることができます。

設計時にFooViewでデータを正しく表示するためにロケータを修正するにはどうすればよいですか?

ここでこの問題を回避するには、手動で以下の方法を使用して設計時のデータを追加することです:

<Page 
x:Class="MVVMLightStartUp.Views.FooViewPage" 
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" 
xmlns:vm="using:MVVMLightStartUp.ViewModels" 
DataContext="{Binding FooViewViewModel, Source={StaticResource Locator}}" 
d:DataContext="{d:DesignInstance Type=vm:DesignTimeViewModel, IsDesignTimeCreatable=True}" 
mc:Ignorable="d"> 

、コード内の後ろDesignTimeViewModelを定義します。CS:あなたは以下のブログのいくつかを参照することができます詳細について

public class DesignTimeViewModel 
{ 
    public ObservableCollection<Foo> BindingData { get; set; } 

    public DesignTimeViewModel(DesignTimeDataService dataservice) 
    { 
     var FooList = dataservice.GetFoo(); 
     BindingData = new ObservableCollection<Foo>(FooList); 
    } 
} 

https://docs.microsoft.com/en-us/windows/uwp/data-binding/displaying-data-in-the-designer https://msdn.microsoft.com/en-us/magazine/dn169081.aspx

+0

デバッグが完全に働きました。問題は次の行です: 'SimpleIoc.Default.Register(()=> _navigationService); ' NavigationServiceが既に登録されているという例外を送出しました。だから私はデザインモードのチェックでそれを投げて、すべて今働いて –

+1

OK。自分のコードでMVVMLightを使用している間、同じものを再現することができます。このような音はMVVMLightの問題です –

関連する問題