使用MVVM选择并复制WPF文本框中的文本
本文关键字:文本 WPF 复制 MVVM 选择 使用 | 更新日期: 2023-09-27 18:26:33
我发现了这个问题,它帮助我实现了我想要做的部分事情:MVVM-我如何在文本框中选择文本?
我的第一个问题是,我有两个文本框,每个文本框都有一个"全选"按钮,但我不知道如何调整接受的答案,以便独立控制每个文本框。
此外,我想为每个添加一个"复制选定的文本"按钮。
如何在坚持MVVM模式的同时做到这一点?
您可以将这两个按钮绑定到不同的命令,这些命令调用不同文本框上的工作,也可以使用commandParameters来区分要处理的内容。
您可以通过创建AttachedProperty或只制作一个自定义控件来完成链接的帖子。实际上,您需要做的是为文本选择创建一个可绑定的属性。TextBox的属性"SelectedText"听起来不错,但如果您试图在WPF中绑定到它,它会抛出一个错误,因为它不是DependencyProperty。属性必须是DependencyProperty才能绑定到它。
所以你创建了一个,比如IsTextSelected作为bool,当它改变时,你的AttachedProperty或自定义控件会处理它,并执行SelectAll()或SelectedText=Text;
如果做一个项目,我建议使用AttachedProperty。然而,您要求自定义控件,我认为如果对一种类型的控件进行多个功能改进,就应该使用自定义控件,而这些控件不能在不同类型上重复使用。
public class SmartTextBox : TextBox
{
public static readonly DependencyProperty IsSelectedTextProperty = DependencyProperty.RegisterAttached("IsSelectedText",
typeof(bool), typeof(SmartTextBox), new FrameworkPropertyMetadata(false, OnIsSelectedChanged));
public bool IsSelectedText
{
get { return (bool)GetValue(IsSelectedTextProperty); }
set { SetValue(IsSelectedTextProperty, value); }
}
private static void OnIsSelectedChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
SmartTextBox textbox = sender as SmartTextBox;
if ((bool)e.NewValue)
{
textbox.Focus();
textbox.SelectAll();
}
}
}
用法:ViewModel
- 注意1在
set
期间,我不会对值是否相同进行IF,以便您可以随时强制执行,而不跟踪用户所做的操作 注意2制作多个属性,IsSelectedUsername、IsSelectedFilepath等,并绑定这些属性。每个SmartTextBox都绑定到一个,并将处理一个更改。
public bool IsSelectedText { get { return isSelectedText; } set { isSelectedText = value; RaisePropertyChanged("IsSelectedText"); } } private void SelectAllExecute() { IsSelectedText = true; }
用法:XAML
xmlns:custom="clr-namespace:xyz.View.Controls"
<custom:SmartTextBox Text="{Binding Path=MyText}"
IsSelectedText="{Binding Path=IsSelectedText}"/>
检索所选文本时,您需要向自定义控件添加一个可以绑定的新依赖项属性,以及控件更新它的方法。我选择了控件何时离开焦点,而不是更改选择,因为我希望用户在我需要了解所选文本之前先单击按钮。
public static readonly DependencyProperty SelectedText2Property = DependencyProperty.RegisterAttached("SelectedText2",
typeof(string), typeof(SmartTextBox), new PropertyMetadata(""));
public string SelectedText2
{
get { return (string)GetValue(SelectedText2Property); }
set { SetValue(SelectedText2Property, value); }
}
protected override void OnLostFocus(RoutedEventArgs e)
{
SelectedText2 = this.SelectedText;
base.OnLostFocus(e);
}
XAML现在已经绑定:
<custom:SmartTextBox Text="{Binding Path=MyText}"
SelectedText2="{Binding Path=TheSelectedText, Mode=OneWayToSource}"
IsSelectedText="{Binding Path=IsSelectedText}"/>
ViewModel有一个哑属性(不需要引发更改事件,因为它是OneWayToSource)
public string TheSelectedText { get; set; }
在任何你能做的地方
Console.WriteLine(TheSelectedText);