ViewModel に次のようなものがあります。
public enum WorkState
{
Idle, Working, Stopping
};
public class MainViewModel : ViewModelBase
{
public const string StatePropertyName = "State";
private WorkState _state = WorkState.Idle;
public WorkState State
{
get
{ return _state; }
set
{
if (_state == value)
{
return;
}
RaisePropertyChanging(StatePropertyName);
_state = value;
RaisePropertyChanged(StatePropertyName);
StartStopCommand.RaiseCanExecuteChanged(); // <—————————————
}
}
private RelayCommand _startStopCommand;
public RelayCommand StartStopCommand
{
get
{
return _startStopCommand
?? (_startStopCommand = new RelayCommand(
() =>
{
if (State == WorkState.Idle)
{
State = WorkState.Working;
}
else if (State == WorkState.Working)
{
State = WorkState.Stopping;
new Thread(() =>
{
Thread.Sleep(5000);
State = WorkState.Idle;
}).Start();
}
},
() => (State == WorkState.Idle ||
(State == WorkState.Working)));
}
}
}
私のビューのボタン:
<Button Command="{Binding StartStopCommand}">
<Button.Style>
<Style>
<Style.Triggers>
<DataTrigger Binding="{Binding State}" Value="{x:Static vm:WorkState.Idle}">
<Setter Property="Button.Content" Value="Start"/>
</DataTrigger>
<DataTrigger Binding="{Binding State}" Value="{x:Static vm:WorkState.Working}">
<Setter Property="Button.Content" Value="Stop"/>
</DataTrigger>
<DataTrigger Binding="{Binding State}" Value="{x:Static vm:WorkState.Stopping}">
<Setter Property="Button.Content" Value="Stop"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
しかし、Stop ボタンを押して State プロパティが Idle に変わると、ボタンはそのテキストを「Start」に変更するだけで、ウィンドウ内のどこかをクリックするまで無効のままになります。
State プロパティのセッターに RaiseCanExecuteChanged を追加しましたが、役に立ちませんでした。
私は何を間違っていますか?
また、同じコマンドで Start/Stop を使用し、ボタン テキストを設定するための DataTriggers を使用したこのアプローチが最適かどうかもわかりません。