実行するスクリプト ファイルの行を含むリスト ボックスがあります。スクリプトのブレークポイント行を赤く表示するつもりなので、リスト ボックス コンテナーのスタイルで
<DataTrigger Value="True">
<DataTrigger.Binding>
<MultiBinding Converter="{StaticResource IsBreakpointLineConverter}">
<Binding Path="DataContext" ElementName="scriptListBox"/>
<Binding RelativeSource="{RelativeSource Self}" Path="(ItemsControl.AlternationIndex)"/>
</MultiBinding>
</DataTrigger.Binding>
<Setter Property="Foreground" Value="Red"/>
</DataTrigger>
コンバーター IsBreakpointLineConverter は、メソッド GetCommandAtLineNumber( int line ) を持つ my ViewModel を最初の引数として取り、スクリプト コマンドの行番号を 2 番目の引数として取ります。
public class IsBreakpointLineConverter : IMultiValueConverter
{
public object Convert( object [] values, Type targetType, object parameter, CultureInfo culture )
{
ScriptViewModel svm = (ScriptViewModel)values[0];
int line = (int)values[1];
ScriptCommand command = svm.GetCommandAtLine( line );
return command != null && command.IsBreakpoint;
}
public object[] ConvertBack( object value, Type[] targetType, object parameter, CultureInfo culture )
{
throw new NotSupportedException();
}
}
私のViewModelは、コマンドのブレークポイントのステータスを切り替えるコマンドも実装しています
private void toggleBreakpoint( object arg )
{
Debug.Assert( _selectedCommand != null );
SelectedLineIsBreakpoint = !SelectedLineIsBreakpoint;
}
これはうまく機能しますが、ListBox は更新されません。新しいスクリプトを選択してから古いスクリプトを選択すると、ブレークポイントの行が赤で表示されます。エルゴ、ブレークポイント行が切り替えられたときにリスト ボックスの内容が更新されるようにする方法が必要です。今立ち往生!
次の恐ろしいハックをtoggleBreakpointに追加すると、意図したとおりに機能します。
private void toggleBreakpoint( object arg )
{
Debug.Assert( _selectedCommand != null );
SelectedLineIsBreakpoint = !SelectedLineIsBreakpoint;
_scriptLines = new List<string>( _scriptLines );
OnPropertyChanged( "ScriptLines" );
}