Белые линии вместо слов в CompletionWindow (пространство имен CodeCompletion), когда AvalonEdit используется из F#

Я использую библиотеку AvalonEdit C# из кода F# и выполняю завершение кода. Кажется, все работает, как и ожидалось, окно завершения кода отображается, всплывающие подсказки в отдельных строках отображаются правильно, выбранные слова вставляются в документ. Единственная проблема заключается в том, что все строки в окне завершения являются пустыми, как будто они ничего не содержат.

Выполнение кода в Visual Studion 2013 здесь не совсем удобно, потому что оно неожиданно влияет на поведение окна завершения, которое отличается от того, когда точки останова не используются.

Вот данные MyCompletionData, взятые из справки AvalonEdit и переписанные в F#:

module CompletionData

open ICSharpCode.AvalonEdit.CodeCompletion
open System
open System.Windows.Media.Imaging

/// Implements AvalonEdit ICompletionData interface to provide the entries in the
/// completion drop down.
type MyCompletionData (text:string) = 
    let _text = text

    interface ICompletionData with

        member this.Complete (textArea, completionSegment, insertionRequestEventArgs) =
            textArea.Document.Replace(completionSegment, ((this :> ICSharpCode.AvalonEdit.CodeCompletion.ICompletionData).Text: string));

        // Use this property if you want to show a fancy UIElement in the list.
        member this.Content
            with get () = (this :> ICSharpCode.AvalonEdit.CodeCompletion.ICompletionData).Text :> obj

         member this.Description
            with get () = ("Description for " + (this :> ICSharpCode.AvalonEdit.CodeCompletion.ICompletionData).Text ) :> obj

        member  this.Image
            with get () = null 

        member this.Priority
            with get () = 1.0

        member this.Text = _text

1 ответ

Это можно решить, как описано здесь: /questions/5783600/svyazyivanie-dannyih-s-f-viewmodel

Самый прямой обходной путь - определить его как явное свойство (а реализация интерфейса может просто ссылаться на основное свойство).

type MyCompletionData (text:string) = 
    let _text = text

    member this.Text = text

    member this.Complete (textArea:TextArea, completionSegment, insertionRequestEventArgs) =
            textArea.Document.Replace(completionSegment, ((this :> ICSharpCode..CodeCompletion.ICompletionData).Text: string));

    member this.Content = (this :> ICSharpCode..CodeCompletion.ICompletionData).Text :> obj

    member this.Description = ("Description for " + (this :> ICSharpCode..CodeCompletion.ICompletionData).Text ) :> obj

    member  this.Image = null

    member this.Priority = 1.0

    interface ICompletionData with

        member this.Complete (textArea, completionSegment, insertionRequestEventArgs) =
            this.Complete (textArea, completionSegment, insertionRequestEventArgs)

        // Use this property if you want to show a fancy UIElement in the list.
        member this.Content = this.Content

        member this.Description = this.Description

        member  this.Image = this.Image

        member this.Priority = this.Priority            

        member this.Text = this.Text 
Другие вопросы по тегам