gpt4 book ai didi

c# - 如何从 ViewModel 读取 TextBox 焦点 - MVVM Light

转载 作者:行者123 更新时间:2023-12-03 10:22:18 24 4
gpt4 key购买 nike

我有两个文本框,在我的 ViewModel 中,我希望能够跟踪当前焦点所在的框。

<TextBox x:Name="textBox1" Text="Text Box 1"/>
<TextBox x:Name="textBox2" Text="Text Box 2"/>

如何从我的 ViewModel 中读取/识别当前焦点所在的文本框?

最佳答案

有几种方法可以实现这一目标,其中一些:

1) 使用行为:

  • 您需要System.Windows.Interactivity.dll
  • 行为(设置 IsFocused 属性不会使元素集中,您需要稍微扩展行为才能实现此目的)
    public class FocusChangedBehavior : Behavior<UIElement>
    {
    public static readonly DependencyProperty IsFocusedProperty =
    DependencyProperty.Register(
    nameof(IsFocused),
    typeof(bool),
    typeof(FocusChangedBehavior),
    new FrameworkPropertyMetadata(default(bool),
    FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));

    public bool IsFocused
    {
    get { return (bool)this.GetValue(IsFocusedProperty); }
    set { this.SetValue(IsFocusedProperty, value); }
    }

    /// <inheritdoc />
    protected override void OnAttached()
    {
    this.AssociatedObject.GotFocus += this.AssociatedObjectFocused;
    this.AssociatedObject.LostFocus += this.AssociatedObjectUnfocused;
    }

    /// <inheritdoc />
    protected override void OnDetaching()
    {
    this.AssociatedObject.GotFocus -= this.AssociatedObjectFocused;
    this.AssociatedObject.LostFocus -= this.AssociatedObjectUnfocused;
    }

    private void AssociatedObjectFocused(object sender, RoutedEventArgs e)
    {
    this.IsFocused = true;
    }

    private void AssociatedObjectUnfocused(object sender, RoutedEventArgs e)
    {
    this.IsFocused = false;
    }
    }
  • 在 XAML 中绑定(bind) IsFocused到 ViewModel 中的属性。xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
    <TextBox x:Name="textBox1" Text="Text Box 1">
    <i:Interaction.Behaviors>
    <local:FocusChangedBehavior IsFocused="{Binding IsFocusedTxt1}" />
    </i:Interaction.Behaviors>
    </TextBox>

    <TextBox x:Name="textBox2" Text="Text Box 2">
    <i:Interaction.Behaviors>
    <local:FocusChangedBehavior IsFocused="{Binding IsFocusedTxt2}" />
    </i:Interaction.Behaviors>
    </TextBox>
  • 最后在 View-Model 创建属性
    public bool IsFocusedTxt1 { get; set; }

    public bool IsFocusedTxt2 { get; set; }


  • 2) 或者你可以使用EventTrigger在 XAML
  • 您需要System.Windows.Interactivity.dllMicrosoftExpressionInteractions (For the ActionCommand)
  • 事件触发器:
    <TextBox x:Name="textBox1" Text="Text Box 1">
    <i:Interaction.Triggers>
    <i:EventTrigger EventName="GotFocus">
    <i:InvokeCommandAction Command="{Binding NotifyFocusedReceivedTxt1Command}" />
    </i:EventTrigger>
    </i:Interaction.Triggers>
    </TextBox>
  • 在 ViewModel 创建命令 NotifyFocusedReceivedTxt1Command
    public ICommand NotifyFocusedReceivedTxt1Command { get; }

    // in constructor
    this.NotifyFocusedReceivedTxt1Command = new ActionCommand(this.FocusedReceivedTxt1);

    // and method
    private void FocusedReceivedTxt1()
    {
    // Your logic
    }
  • 此外,如果您不想引入许多命令/属性,您可以使用相同的命令并通过设置 CommandParameter 传递不同的文本框。 (稍微破坏了 MVVM,但不是很严重)
    <TextBox x:Name="textBox1" Text="Text Box 1">
    <i:Interaction.Triggers>
    <i:EventTrigger EventName="GotFocus">
    <i:InvokeCommandAction Command="{Binding NotifyFocusedReceivedCommand}"
    CommandParameter="{Binding ., ElementName=textBox1}" />
    </i:EventTrigger>
    </i:Interaction.Triggers>
    </TextBox>

    <TextBox x:Name="textBox2" Text="Text Box 2">
    <i:Interaction.Triggers>
    <i:EventTrigger EventName="GotFocus">
    <i:InvokeCommandAction Command="{Binding NotifyFocusedReceivedCommand}"
    CommandParameter="{Binding ., ElementName=textBox2}" />
    </i:EventTrigger>
    </i:Interaction.Triggers>
    </TextBox>


    public ICommand NotifyFocusedReceivedCommand { get; }

    // in constructor
    this.NotifyFocusedReceivedCommand = new ActionCommand(this.FocusedReceived);

    // and method
    private void FocusedReceived(object control)
    {
    var txt = (TextBox)control;
    bool isFocused = txt.IsFocused;
    string name = txt.Name;
    }
  • 关于c# - 如何从 ViewModel 读取 TextBox 焦点 - MVVM Light,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51918039/

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