2010-11-30 11 views

Répondre

7

Un moyen facile d'obtenir des données au moment du design dans Visual Studio 2010 consiste à utiliser un datacontext design-design. Un exemple court avec une fenêtre et un ViewModel, pour DataContext, le d: DataContext sera utilisé en mode Design et la source statique sera utilisée en exécution. Vous pouvez également utiliser un ViewModel distinct pour la conception, mais dans cet exemple, j'utiliserai le même ViewModel pour les deux.

<Window ... 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:local="clr-namespace:DesignTimeData" 
     mc:Ignorable="d"    
     d:DataContext="{d:DesignInstance local:MyViewModel, 
         IsDesignTimeCreatable=True}"> 
    <Window.Resources> 
     <local:MyViewModel x:Key="MyViewModel" /> 
    </Window.Resources> 
    <Window.DataContext> 
     <StaticResource ResourceKey="MyViewModel"/> 
    </Window.DataContext> 
    <StackPanel> 
     <TextBox Text="{Binding MyText}" 
       Width="75" 
       Height="25" 
       Margin="6"/> 
    </StackPanel> 
</Window> 

Et dans la propriété ViewModels MonTexte nous vérifions si nous sommes en mode de conception et dans ce cas nous revenons autre chose.

public class MyViewModel : INotifyPropertyChanged 
{ 
    public MyViewModel() 
    { 
     MyText = "Runtime-Text"; 
    } 

    private string m_myText; 
    public string MyText 
    { 
     get 
     { 
      // Or you can use 
      // DesignerProperties.GetIsInDesignMode(this) 
      if (Designer.IsDesignMode) 
      { 
       return "Design-Text"; 
      } 
      return m_myText; 
     } 
     set 
     { 
      m_myText = value; 
      OnPropertyChanged("MyText"); 
     } 
    } 
    public event PropertyChangedEventHandler PropertyChanged; 
    private void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

Designer.cs, qui se trouve here, ressemble à ceci

public static class Designer 
{ 
    private static readonly bool isDesignMode; 
    public static bool IsDesignMode 
    { 
     get { return isDesignMode; } 
    } 
    static Designer() 
    { 
     DependencyProperty prop = 
      DesignerProperties.IsInDesignModeProperty; 
     isDesignMode = 
      (bool)DependencyPropertyDescriptor. 
       FromProperty(prop, typeof(FrameworkElement)) 
         .Metadata.DefaultValue; 
    } 
} 
-3

Vous pouvez placer votre contenu dans une autre propriété et tester si la valeur est vide. Dans ce cas, retournez la fausse valeur que vous voulez.

private string _content; 
public string Content 
{ 
    get 
    { 
     if (_content != "") return _content; 
     else return "FAKE"; 
    } 
    set { _content= value; } 
} 
+0

Cela ne ferait-il pas la même chose lors de l'exécution? – Jens

+0

@Guy: Veuillez poster votre réponse dans une autre réponse afin qu'elle puisse être acceptée. –

+0

Je ne pense pas que votre suggestion fonctionne pour moi :(En exécution, "FAKE" va remplacer "" valeur - ce n'est pas prévu! –

3

Vous pouvez utiliser la propriété FallbackValue pour afficher quelque chose dans le temps de conception aussi bien. Mais ce sera également la valeur à l'exécution si votre liaison échoue.

<TextBox Text="{Binding MyText, FallbackValue='My Fallback Text'}"/>