2016-04-01 12 views
2

Kafamı WPF, Unity ve MvvMlight (galasoft) etrafında almaya çalışıyorum. Şimdiye kadar benim küçük kurulum çalışmalarım. Uygulamamı çalıştırırsam, etiket DataService tarafından oluşturulan rastgele bir adla doldurulur. (tüm hareketli parçaları işe almak için küçük zafer)Unity 4 ve MvvmLight ile Visual Studio'da DesignTime verileri nasıl etkinleştirilir?

Ancak Visual Studio'nun tasarım görünümünde etiket boş olarak kalır. VisualStudio'yu etiketimde bazı 'tasarım zamanı' verileri oluşturmaya nasıl ikna edebilirim?

kullanıyorum: Visual Studio Premium 2013 Birlik 4.0.1, MvvmLight 5.2, App.xaml ben yılında 4,5

App.xaml.cs

public partial class App : Application 
{ 
    protected override void OnStartup(StartupEventArgs e) 
    { 
     IUnityContainer container = new UnityContainer(); 
     container.RegisterType<IDataService, DataService>(); 
     container.RegisterType<IMainViewModel, MainViewModel>(); 

     MainWindow mainWindow = container.Resolve<MainWindow>(); 
     mainWindow.Show(); 

     base.OnStartup(e); 
    } 
} 

.net StartupUri

MainWindow.xaml

tanımlamadınız
<Window x:Class="UnityMvvmTest.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="300" Width="500"> 
    <Grid> 
     <Label x:Name="myLabel" Content="{Binding MyText}"/> 
    </Grid> 
</Window> 

MainWindow.xaml.cs

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    public MainWindow(IMainViewModel theViewModel) 
     : this() 
    { 
     this.DataContext = theViewModel; 
    } 
} 

MainViewModel.cs

public class MainViewModel : ViewModelBase, IMainViewModel 
{ 
    private readonly IDataService _dataService; 

    public MainViewModel(IDataService dataService) 
    { 
     _dataService = dataService; 

     if (IsInDesignMode) 
     { 
      // Code runs in design time data. 
      MyText = "Design Data"; 
     } 
     else 
     { 
      // Code runs "for real" 
      MyText = _dataService.GetName(); 
     } 

    } 

    public string MyText { get; set; } 
} 

cevap

0

I

https://stackoverflow.com/a/3380895/249845 ipucu olarak kullanan bir yöntem, buldum daire (ikinci oluşturulan) IMainVieModel'un ayrı bir ad alanına uygulanması: UnityMvvmTest.ViewModel.Design. Bu uygulamanın mantığı yoktur, sadece özellikleri doldurur, böylece tasarımcının göstermesi gereken bazı veriler vardır.

Bu uygulama, DesignTime DataContext olarak belirtildiği için tasarım zamanında kullanılır. (xmlns:d, xmlns:mc ve xmlns:vm ile). Çalışma zamanı, see why sırasında d ad alanını gizlemek için mc -namespace gereklidir.

Sonuç, Xaml'de IMainViewModel ek (neredeyse boş) uygulama olmak üzere 5 ek satırdır. Ve IsInDesignMode için test eden bir kurucunun yerine, kodun içinde ekstra (boş) bir kurucu. Bu bir şey değil çünkü birlik, kurucuyu çözebileceği en fazla parametreyle seçecek.

MainWindow.xaml

<Window x:Class="UnityMvvmTest.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525" 

    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:vm="clr-namespace:UnityMvvmTest.ViewModel.Design" 
    d:DataContext="{d:DesignInstance IsDesignTimeCreatable=True, Type=vm:MainViewModel}" 
    mc:Ignorable="d" 
    > 
    <Grid> 
     <Label x:Name="myLabel" Content="{Binding MyText}" /> 
    </Grid> 
</Window> 

MainWindow.xaml.cs

public partial class MainWindow : Window 
{ 
    // Contructor used in DesignTime 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    //Constructor used by Unity 
    public MainWindow(IMainViewModel theViewModel) 
     : this() 
    { 
     this.DataContext = theViewModel; 
    } 
} 

MainViewModel.cs (tasarım zamanı uygulaması)

namespace UnityMvvmTest.ViewModel.Design 
{ 
    public class MainViewModel : IMainViewModel 
    { 

     public MainViewModel() 
     { 
      MyText = "my Design time data"; 
     } 

     public string MyText { get; set; } 
    } 
}