WPFの列挙型へのバインディングをいじってみましたが、あまり好きではありませんでした。
これを回避するには、プロパティをモデル内のそれぞれのプロパティにマッピングします。getメソッドでは、列挙型の状態への依存関係を実装します。
例えば:
<Button Height="41" HorizontalAlignment="Center" Style="{StaticResource ButtonStyle}"
Margin="407,77,289,0" Name="buttonSearch" VerticalAlignment="Top" Width="137" Click="search_click"
IsEnabled="{Binding IsSearchButtonEnabled}" ...
この列挙型があるとしましょう:
public enum States
{
StateOne,
StateTwo,
StateThree
}
ビューモデルでは、次のことができます。
public bool IsSearchButtonEnabled
{
get
{
return ((Model.actualState) == States.StateTwo);
}
}
自動的に更新するには、ViewModelがINotifyPropertyChangedを実装する必要があります。私は、ViewModelsが常にサブクラス化する一般的な実装を使用して、物事を単純化します。これはこのように見え、InvokePropertyChanged(string propertyName)が呼び出されるたびにビューの更新を処理する必要があります。ViewModelは、ビューを更新する必要があること、およびこのメソッドがいつ呼び出されるかを知る必要があります。モデルで同じ手法を使用して、状態列挙型のセッターの変更をサブスクライバーVMに通知するイベントハンドラーをモデルに配置できます。
public class ViewModelBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public static event PropertyChangedEventHandler PropertyChangedStatic;
public void InvokePropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
public static void InvokePropertyChangedStatic(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChangedStatic;
if (handler != null) handler(null, new PropertyChangedEventArgs(propertyName));
}
}