2017-04-07 2 views
0

In UWP-Anwendungen funktioniert das RichEditBox-Steuerelement nicht gut mit MVVM-basierten Entwurfsmustern, wenn Text an/aus übergeben werden muss es im ViewModel, also habe ich eine benutzerdefinierte Version davon erstellt.Bidirektionale Bindung an benutzerdefinierte RichEditBox-Eigenschaften in ViewModel (UWP)

In der benutzerdefinierten RichEditBox habe ich eine benutzerdefinierte DependencyProperty namens Text. Mein Ziel besteht einfach darin, diese Eigenschaft in zwei Richtungen an eine Zeichenfolgeneigenschaft zu binden, die sich in meinem ViewModel befindet. Auf diese Weise kann ich die Zeichenfolge in meinem ViewModel verwenden, um Text in meiner benutzerdefinierten RichEditBox festzulegen. Dies funktioniert mit Leichtigkeit, wenn ich den XAML-Ansatz nehme. Wie kann das in meiner Code-Behind-Datei gemacht werden? Ich habe es versucht und es nicht geschafft. Vielen Dank.

+0

Was haben Sie versucht? Hast du einen Code, mit dem du anfangen kannst? –

Antwort

0

In der benutzerdefinierten RichEditBox habe ich eine benutzerdefinierte DependencyProperty namens Text. Mein Ziel besteht einfach darin, diese Eigenschaft in zwei Richtungen an eine Zeichenfolgeneigenschaft zu binden, die sich in meinem ViewModel befindet. Auf diese Weise kann ich die Zeichenfolge in meinem ViewModel verwenden, um Text in meiner benutzerdefinierten RichEditBox festzulegen.

Für Ihr Szenario könnten Sie eine CustomText Eigenschaft für die benutzerdefinierte RichEditBox erweitern. Wie Sie wissen, können Sie String für RichEditBox von Document.SetText und Document.GetText Methode abrufen oder festlegen. Und dann könnten Sie den Textwechsel von RichEditBox von TextChanged Ereignis hören. Ich habe eine CustomRichEditBox mit bidirektionaler Bindung CustomText -Eigenschaft erstellt. Bitte verweisen Sie auf den folgenden Code.

public string CustomText 
    { 
     get { return (string)GetValue(CustomTextProperty); } 
     set 
     { 
      SetValue(CustomTextProperty, value); 
     } 
    } 

    public static readonly DependencyProperty CustomTextProperty = 
     DependencyProperty.Register("CustomText", typeof(string), typeof(CustomRichEditBox), new PropertyMetadata(null, new PropertyChangedCallback(OnCustomTextChanged))); 

    private static void OnCustomTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     CustomRichEditBox rich = d as CustomRichEditBox; 
     if (e.NewValue != e.OldValue) 
     { 
      rich.Document.SetText(Windows.UI.Text.TextSetOptions.None, e.NewValue.ToString()); 
     } 
    } 

die Änderungen von RichEditBox Text überwachen dynamisch die View-model ändern.

public CustomRichEditBox() 
{ 
    this.DefaultStyleKey = typeof(RichEditBox); 
    this.TextChanged += CustomRichEditBox_TextChanged; 
} 

private void CustomRichEditBox_TextChanged(object sender, RoutedEventArgs e) 
{ 
    string value = string.Empty; 
    this.Document.GetText(Windows.UI.Text.TextGetOptions.AdjustCrlf, out value); 
    if (string.IsNullOrEmpty(value)) 
    { 
     return; 
    } 
    CustomText = value; 
} 

Wenn Sie Ansichtsmodell an die Steuerung von Ihrem binden Code-Behind-Datei, die Sie den folgenden Code verweisen könnte.

Binding myBinding = new Binding(); 
myBinding.Source = this.DataContext; 
myBinding.Path = new PropertyPath("Info"); 
myBinding.Mode = BindingMode.TwoWay; 
myBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged; 
BindingOperations.SetBinding(MyEditBox, CustomRichEditBox.CustomTextProperty, myBinding); 

Ich habe die code sample auf Github hochgeladen. Bitte prüfe.

+0

Tut mir leid, dass ich zu spät zu den Antworten komme. Vielen Dank. Aber ich denke, du hast meinen Standpunkt verpasst. Ich versuche, wie in dem Post angegeben, an die Steuerung aus meiner Code-Behind-Datei zu binden ... Ich machte deutlich, dass die Bindung über XAML kein Problem darstellte. Danke noch einmal! –

+0

Ich habe meine Antwort bearbeitet. Es funktioniert auch ziemlich gut, wenn Sie ViewModel an das Steuerelement von Code binden. Bist du das außer? –

+0

Wenn die Antwort Ihnen geholfen hat und Ihr Problem gelöst wurde, bitte [markieren] (https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235) die Antwort als akzeptiert .Vielen Dank! –

Verwandte Themen