2016-09-08 1 views
0

J'ai un projet WPF dans lequel je règle dynamiquement le style de certains éléments par programmation dans mon ViewModel.Définition par programmation du style WPF au style de base

Je définir mes propriétés de style comme ceci:

private static Style okTextStyle = Application.Current.FindResource("SimpleTextBox") as Style; 
private static Style errorTextStyle = Application.Current.FindResource("SimpleTextBoxError") as Style; 

private Style keyTypeValueMeaningStyle = okTextStyle; 
public Style KeyTypeValueMeaningStyle 
{ 
    get { return keyTypeValueMeaningStyle; } 
    set 
    { 
     keyTypeValueMeaningStyle = value; 
     OnPropertyChanged(new PropertyChangedEventArgs("KeyTypeValueMeaningStyle")); 
    } 
} 

// ...later in the code... 

if (error) 
{ 
    ... 
    KeyTypeValueMeaningStyle = errorTextStyle; 
} 
else 
{ 
    ... 
    KeyTypeValueMeaningStyle = okTextStyle; 
} 

Et l'utiliser dans mon XAML comme ceci:

Style="{Binding KeyTypeValueMeaningStyle, UpdateSourceTrigger=PropertyChanged}" 

Tout cela fonctionne parfaitement bien; cependant, j'essaie de rationaliser un peu plus et au lieu d'avoir okTextStyle mis à un style nommé dans mon ResourceDictionary, je veux simplement qu'il soit défini sur mon style de base TextBox défini dans mon ResourceDictionary, mais je ne sais pas si cela est possible .

J'ai essayé de définir une valeur nulle ou vide comme ceci, mais cela ne fonctionne pas.

private static Style okTextStyle = null As Style; 

J'ai aussi essayé de faire des choses similaires dans mon bloc else mais il ne fonctionne pas non plus. Je devine que puisque dans mon XAML je définis toujours un style, il veut une référence de style valide là-dedans, pas seulement une valeur nulle ou vide.

Certes, il s'agit d'un problème de programmation du premier monde car tout fonctionne correctement. Mais la définition SimpleTextBox est juste une copie du style de base à ce stade et j'essaie de rationaliser un peu si possible et ne pas avoir des styles en double. Cela peut-il être fait?

+0

Oui, ce n'est pas MVVM ... – Will

Répondre

0
Application.Current.FindResource(typeof(TextBox)); 

Si vous voulez être un peu plus persistant, regardez FrameworkElement.DefaultStyleKey. Cela dit, ce n'est pas quelque chose dont un viewmodel devrait être responsable. Par ailleurs, null As Style renvoie exactement le même null que null sans la distribution. Si j'étais sur l'équipe C#, je voudrais que le compilateur vous donne un avertissement Otiose Cast sur cette ligne. Ce n'est pas la seule raison pour laquelle je ne serai jamais dans l'équipe C#, mais c'est un bon point de départ.

+0

Je comprends les commentaires sur la mauvaise utilisation du modèle MVVM parce que le viewmodel ne devrait pas piloter l'interface utilisateur; Cependant, je n'ai pas vraiment vu une approche consensuelle pour lier les propriétés de l'interface utilisateur via MVVM. Chaque option que j'ai vue nécessite soit le viewmodel pour piloter certains aspects de l'interface utilisateur, soit la dépendance vis-à-vis du viewmodel communiquant avec le code de vue derrière. Il ne semble pas y avoir (que je puisse trouver) un modèle qui soit largement accepté. – bassrek

+1

@bassrek Je ferais une sorte de thème avec 'DynamicResource'. Une autre option (peut-être c'est ce que vous faites déjà) est de séparer au moins les trucs Style dans un thème global séparé "viewmodel". –