2017-06-15 64 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打開你的應用程序,找出第二個XDesProc.exe並記錄它的PID
  5. 關閉FooView頁面。
  6. 轉到Visual Studio,選擇Debug-> Attach to Process,然後選擇managed(v4.6,v4.5,v4.0)代碼,然後選擇Blend PID of XDesProc.exe
  7. 返回Blend並打開您想要查看設計數據問題的頁面
  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

好的。我可以在我的代碼中使用MVVMLight重現相同的效果。聽起來像這是MVVMLight的問題 –