gpt4 book ai didi

c# - 使用 MVVM 在 WPF 文本框中选择和复制文本

转载 作者:行者123 更新时间:2023-11-30 20:55:48 24 4
gpt4 key购买 nike

我发现这个问题可以帮助我实现我想做的部分事情:MVVM- How can I select text in a textbox?

我的第一个问题是我有两个文本框,每个文本框都有一个“全选”按钮,但我不知道如何调整已接受的答案以便我可以独立控制每个文本框。

此外,我想为每个添加一个“复制所选文本”按钮。

如何在坚持 MVVM 模式的同时做到这一点?

最佳答案

您可以将这两个按钮绑定(bind)到不同的命令来调用不同的文本框,或者您可以使用 commandParameters 来区分要处理的内容。

您可以通过创建 AttachedProperty 或仅创建自定义控件来完成链接的帖子。您基本上需要做的是为文本选择创建一个可绑定(bind)属性。 TextBox 的属性“SelectedText”听起来是个不错的主意,但如果您尝试在 WPF 中绑定(bind)到它,则会引发错误,因为它不是 DependencyProperty。属性必须是 DependencyProperty 才能绑定(bind)到它。

因此您创建一个,例如 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();
}
}
}

用法: View 模型

  • 注意 1 我不会对 set 期间值是否相同进行 IF,以便您可以随时强制执行它,而不是跟踪用户所做的事情。
  • Note2 创建多个属性,IsSelectedUsername、IsSelectedFilepath 等,并绑定(bind)它们。每个 SmartTextBox 都绑定(bind)到一个,并将处理一个更改。

    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}"/>

检索选定的文本,您需要向自定义控件添加一个您可以绑定(bind)到的新依赖属性以及控件更新它的方法。我选择控件何时离开焦点而不是更改选择,因为我希望用户在我需要知道所选文本之前执行类似单击按钮的操作。

    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 现在绑定(bind)了它:

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

关于c# - 使用 MVVM 在 WPF 文本框中选择和复制文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18060591/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com