2014-07-24 2 views
0

나는 AvalonEditor 컨트롤이 포함 된 EditorViewModel이 있습니다. 나는 SelectionLengthSelectionStart 속성을 Document으로 바인딩하고 모두 만족합니다. 코드 숨김 값을 업데이트하는 마우스와 함께 텍스트를 선택할 수 있습니다. 여기에 문제가 있습니다, 콜백을 통해 호출하는 C# 코드로 오류를 마샬링하는 C++ DLL을 호출합니다.이 역시 잘 작동합니다. 이 작업을 수행하는 코드는 내가런타임시 MVVM을 사용하여 바인딩 실패

public void SelectLine(int lineNumber) 
{ 
    DocumentLine line = Document.GetLineByNumber(lineNumber); 
    SelectionStart = line.Offset; 
    SelectionLength = line.Length; 
} 

컴파일러합니다 (C++ 코드) 컴파일 오류 안타와 콜백을 사용하여이 EditorViewModel에서

// Note, I need the call back to run on the main UI thread. 
TaskScheduler scheduler = TaskScheduler.FromCurrentSynchronizationContext(); 
Callbacks.CompilerErrorCallback = 
    (message, documentPath, lineNumber) => 
{ 
    string path = String.Empty; 
    Task.Factory.StartNew(async() => 
    { 
     // Open the erronious file and scroll to line. 
     path = Path.Combine(
      WorkingDirectory, String.Format("GDLCode\\{0}", documentPath)); 
     Open(path); 
     //EditorViewModel evm = GetOpenEditorViewModels() 
     // .FirstOrDefault(vm => vm.FullFilePath.CompareNoCase(path)); 
     //if (evm != null) 
     //{ 
     // ActivateItem(evm); 
     // evm.SelectLine(lineNumber + 1); 
     //} 

     // Display error. 
     await dialogManager.ShowDialog<MessageDialogResult>(
      new MessageBoxViewModel("GDECore Logic Compilation Error", 
       message, 
       settings)); 
     return; 
    }, CancellationToken.None, 
     TaskCreationOptions.None, 
     scheduler); 
}; 

// Run the C++ code below and pass in the `Callbacks.CompilerErrorCallback` object. 

입니다. 문제가되는 코드 파일을 열고 문제가되는 행을 강조 표시합니다. 콜백이 작동하고 매개 변수가 올바르지 만 주석 처리 된 코드 (문제가되는 행을 선택하는 것으로 가정)가 작동하지 않습니다. 그것은 SelectLine으로 들어가고 SelectionLength 던지기 설정시 AvalonEdit에서 ArgumentOutOfRangeException; EditorViewModel은 기본 AvalonEditor 컨트롤에 바인딩되어 있지 않은 것처럼 보입니다. 내가 잘못된 코드를 주석과 코드 파일 후 '수동'선택을 할 수있는 버튼을 추가하지만

public void Test() 
{ 
    EditorViewModel evm = GetOpenEditorViewModels().FirstOrDefault(); 
    if (evm != null) 
    { 
     ActivateItem(evm); 
     evm.SelectLine(1); 
    } 
} 

을 선택은 잘 작동 개설되었습니다. AvalonEditor 컨트롤이 콜백에서 즉시 내 속성에 바인딩되지 않는 것처럼 보이는 이유는 무엇입니까? 분명히 잘못되었습니다.

+0

이 문제가 스레딩입니까? 콜백이 확실히 GUI 스레드에 마샬링되고 있습니까? – GazTheDestroyer

+0

콜백은 _non_-GUI 스레드에 있으므로, GUI 스레드에 코드를 다시 넣기 위해 동기화 컨텍스트와 함께 'Task.Factory'를 사용해야하는 이유는 무엇입니까? – MoonKnight

답변

1

UI 스레드에서 다시 호출되고 있는지 확인할 수 있습니까?

VS 디버거의 스레드 창에서 작업에 분기점이 있는지 알려줍니다. 내가 대신 작업의 Dispatcher.Invoke 방법을 사용하는 것이 좋습니다 것

: 모든이 작업을 수행

Application.Current.Dispatcher.Invoke(() => 
{ 
    // to do something 
}); 

는 개인적으로 내가 반응성 확장 (수신 닷넷)를 사용하여 보는 것, 그것은 많은 스케줄러를 관리 할 수있는 능력을 가지고 작업 IMO보다 낫다.

+0

답장을 보내 주셔서 감사합니다 ... – MoonKnight

+0

Dispatcher.Invoke와 함께 작동합니까? – AwkwardCoder

+0

다음주까지는 이것을 확인할 수 없습니다. 나는 너에게 돌아갈 것이다 ... 너의 시간을 위해 다시 한번 감사한다. – MoonKnight

관련 문제