2017-04-07 18 views
0

UWPアプリケーションでは、RichEditBoxコントロールは、テキストを渡す必要があるときに、MVVMベースのデザインパターンではうまく機能しませんそれはViewModelの中にあるので、カスタムバージョンを作成しました。ViewModel(UWP)の "カスタム" RichEditBoxのカスタムプロパティへの双方向バインディング

カスタムRichEditBoxには、カスタムDependencyPropertyというTextがあります。私の目標は、単に私のViewModelにある文字列プロパティにそのプロパティを双方向でバインドすることです。そうすれば、ViewModelの文字列を使用して、カスタムRichEditBoxにテキストを設定/取得することができます。これはXAMLアプローチをとると簡単に機能します。私のコードビハインドファイルでこれをどうやって行うことができますか?私はやってみました。ありがとう。

+0

何を試しましたか?あなたはいくつかのコードを持っていますか? –

答えて

0

カスタムRichEditBoxには、カスタムのDependencyPropertyというテキストがあります。私の目標は、単に私のViewModelにある文字列プロパティにそのプロパティを双方向でバインドすることです。そうすれば、ViewModelの文字列を使用して、カスタムRichEditBoxにテキストを設定/取得することができます。

RichEditBoxの場合、CustomTextプロパティを拡張することができます。あなたが知っている通りRichEditBoxの文字列をDocument.SetTextDocument.GetTextで取得または設定できます。そして、RichEditBoxというテキストの変更を聞いて、 TextChangedイベントで聞くことができました。私は双方向バインディングCustomTextプロパティを持つCustomRichEditBoxを作成しました。次のコードを参考にしてください。

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()); 
     } 
    } 

View-modelを変更する動的RichEditBoxテキストの変更を監視します。

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; 
} 

コードビハインドファイルのコントロールにViewModelをバインドする場合は、次のコードを参照することができます。

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); 

githubにcode sampleをアップロードしました。チェックしてください。

+0

申し訳ありません返信に遅れています。ありがとう。しかし、私はあなたが私のことを忘れたと思う。投稿に記載されているように、コードビハインドファイルからコントロールにバインドしようとしています... XAMLによるバインディングは問題ありませんでした。再度、感謝します! –

+0

私は自分の答えを編集しました。 ViewModelをコードの背後からコントロールにバインドすると、かなりうまく機能します。それはあなた以外何ですか? –

+0

答えがあなたを助けて問題を解決した場合は、[マーク](https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235)の回答を受け入れてください。どうもありがとうございました! –

関連する問題