在UWP应用程序中,当您需要在ViewModel中向其传递文本时,RichEditBox控件本身不能很好地使用基于MVVM的设计模式,因此我创建了它的自定义版本。 / p>
在自定义RichEditBox中,我有一个名为Text的自定义DependencyProperty。我的目标只是将该属性双向绑定到位于我的ViewModel中的字符串属性。这样我可以使用我的ViewModel中的字符串在我的自定义RichEditBox中设置/获取文本。如果我采用XAML方法,这很容易。但是,如何在我的代码隐藏文件中完成此操作?我尝试过但未能将其拉下来。感谢。
答案 0 :(得分:1)
在自定义RichEditBox中,我有一个名为Text的自定义DependencyProperty。我的目标只是将该属性双向绑定到位于我的ViewModel中的字符串属性。这样我可以使用我的ViewModel中的字符串在我的自定义RichEditBox中设置/获取文本。
对于您的方案,您可以为自定义CustomText
扩展RichEditBox
属性。如您所知,您可以通过RichEditBox
和Document.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。请检查。