0

実行するスクリプト ファイルの行を含むリスト ボックスがあります。スクリプトのブレークポイント行を赤く表示するつもりなので、リスト ボックス コンテナーのスタイルで

<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" );
    }
4

1 に答える 1