双向绑定到" custom" ViewModel(UWP)中的RichEditBox自定义属性

时间:2017-04-07 19:18:59

标签: c# xaml data-binding uwp

在UWP应用程序中,当您需要在ViewModel中向其传递文本时,RichEditBox控件本身不能很好地使用基于MVVM的设计模式,因此我创建了它的自定义版本。 / p>

在自定义RichEditBox中,我有一个名为Text的自定义DependencyProperty。我的目标只是将该属性双向绑定到位于我的ViewModel中的字符串属性。这样我可以使用我的ViewModel中的字符串在我的自定义RichEditBox中设置/获取文本。如果我采用XAML方法,这很容易。但是,如何在我的代码隐藏文件中完成此操作?我尝试过但未能将其拉下来。感谢。

1 个答案:

答案 0 :(得分:1)

  

在自定义RichEditBox中,我有一个名为Text的自定义DependencyProperty。我的目标只是将该属性双向绑定到位于我的ViewModel中的字符串属性。这样我可以使用我的ViewModel中的字符串在我的自定义RichEditBox中设置/获取文本。

对于您的方案,您可以为自定义CustomText扩展RichEditBox属性。如您所知,您可以通过RichEditBoxDocument.SetText方法获取或设置Document.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());
        }
  }

监控RichEditBox文字的更改,动态修改View-model

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

我已将code sample上传到github。请检查。