2016-09-08 6 views
0

私は、自分のViewModelでプログラム的に特定の要素のスタイルを動的に設定するWPFプロジェクトを持っています。WPFスタイルをベースラインスタイルに設定する

私はそうのように私のスタイルのプロパティを定義しています:

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; 
} 

ですからように私のXAMLでそれを使用して:

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

このすべてが完全に正常に動作します。しかし、私はもう少し合理化しようとしているのではなく、okTextStyleを自分のResourceDictionaryの名前付きスタイルに設定するだけで、私は単に私のResourceDictionaryに定義されたTextBoxスタイルを自分のベースに設定したいと思っていますが、 。

nullや空白に設定しようとしましたが、動作しません。

private static Style okTextStyle = null As Style; 

私もelseブロックで同様のことをやってみましたが、それはどちらか動作しません。私はXAMLでは常にスタイルを定義しているので、ヌルまたは空白の値だけではなく、そこに有効なスタイル参照が必要であると推測しています。

確かに、これはすべてが正常に機能しているため、第一世界のプログラミング問題です。しかし、SimpleTextBoxの定義は、この時点でのベースラインスタイルと重複しているだけで、できるだけ単純化し、重複したスタイルを持たないようにしようとしています。これはできますか?

+0

ええと、それはMVVMではありません... – Will

答えて

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

もう少しパニケティになりたい場合は、FrameworkElement.DefaultStyleKeyをご覧ください。

つまり、これはビューモデルが責任を負うべきものではありません。

ちなみに、null As Styleは、キャストなしで全く同じnullnullと返します。もし私がC#チームにいたら、私はコンパイラにあなたにその行のOitoseキャスト警告を与えます。それが私がC#チームに入らないという唯一の理由ではありませんが、始めるには良い場所です。

+0

MVVMパターンの使い方が悪いというコメントを理解しています。これは、viewmodelがUIを駆動すべきではないからです。しかし、私は本当にMVVMを介してUIプロパティをバインドするコンセンサスアプローチを見ていません。私が見たすべてのオプションは、UIのいくつかの側面を駆動するためにビューモデルを必要とするか、ビューコードビヘイビアと通信するビューモデルに依存する必要があります。広く受け入れられているパターンは(私が見つけることができる)ようではありません。 – bassrek

+1

@bassrek私は 'DynamicResource'で何らかのテーマをしたいと思います。もう1つのオプション(多分これはあなたがすでにやっていることです)は、スタイルのものを少なくとも別のグローバルテーマ "viewmodel"に分けることです。 –

関連する問題