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;
}
}
Cela ne ferait-il pas la même chose lors de l'exécution? – Jens
@Guy: Veuillez poster votre réponse dans une autre réponse afin qu'elle puisse être acceptée. –
Je ne pense pas que votre suggestion fonctionne pour moi :(En exécution, "FAKE" va remplacer "" valeur - ce n'est pas prévu! –