나는 AvalonEditor 컨트롤이 포함 된 EditorViewModel
이 있습니다. 나는 SelectionLength
및 SelectionStart
속성을 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 컨트롤이 콜백에서 즉시 내 속성에 바인딩되지 않는 것처럼 보이는 이유는 무엇입니까? 분명히 잘못되었습니다.
이 문제가 스레딩입니까? 콜백이 확실히 GUI 스레드에 마샬링되고 있습니까? – GazTheDestroyer
콜백은 _non_-GUI 스레드에 있으므로, GUI 스레드에 코드를 다시 넣기 위해 동기화 컨텍스트와 함께 'Task.Factory'를 사용해야하는 이유는 무엇입니까? – MoonKnight