gpt4 book ai didi

silverlight - MVVM Light 太快 :)

转载 作者:行者123 更新时间:2023-12-04 23:32:45 29 4
gpt4 key购买 nike

我有一个带有 TextBox 的简单 WM7 页面.此外,我分配了EventToCommand (一个 RelayCommand<string> )到这个 TextBox , 对 TextChanged 使用react事件。为了测试pourposes,我做了额外的方法TextBox_TextChanged在页面的代码后面。命令和TextBox_TextChanged打印带有文本框内容的消息框。
TextBox 的初始值是 "ABC" .然后我按 D 并:

  • TextBox_TextChanged打印 ABCD .
  • 命令打印 ABC . D 不见了。

  • 为什么命令这么快?

    命令声明:
    public RelayCommand<string> TextChanged {get; private set;}

    命令初始化:
    TextChanged = new RelayCommand<string>((s) => MessageBox.Show(s));

    命令绑定(bind):
    <TextBox x:Name="SearchTextBox" Margin="10,0" TextWrapping="Wrap" Text="{Binding SearchString, Mode=TwoWay}" FontStyle="Italic" TextChanged="SearchTextBox_TextChanged" >
    <i:Interaction.Triggers>
    <i:EventTrigger EventName="TextChanged">
    <GalaSoft_MvvmLight_Command:EventToCommand Command="{Binding TextChanged, Mode=OneWay}" CommandParameter="{Binding Text, ElementName=SearchTextBox}"/>
    </i:EventTrigger>
    </i:Interaction.Triggers>
    </TextBox>

    最佳答案

    我无法重现这种行为。我尝试过使用 EventToCommand 和 Behaviour(它只是监听 TextChanged 事件)。

    在没有看到代码的情况下,我怀疑这可能与您获取搜索框文本的方式或其他地方的逻辑错误有关。

    这是我如何使用 EventToCommand 的片段:

    <TextBox Name="SearchTextBox">
    <i:Interaction.Triggers>
    <i:EventTrigger EventName="TextChanged">
    <cmd:EventToCommand Command="{Binding TestTextChangedCommand,Mode=OneWay}" CommandParameter="{Binding Path=Text, ElementName=SearchTextBox}"/>
    </i:EventTrigger>
    <i:Interaction.Triggers>
    </TextBox>

    在 View 模型中
    m_TestTextChangedCommand = new RelayCommand<string>(val => System.Diagnostics.Debug.WriteLine(val));

    如您所见,我使用命令参数将文本框的值传递给 View 模型。这样 View 模型就不必知道文本框来获取文本值。

    这种方法的替代方法是使用行为和双向绑定(bind)来更新属性:
    <TextBox Name="SearchTextBox" Text="{Binding TextInViewModel, Mode=TwoWay}" >
    <i:Interaction.Behaviors>
    <sc:UpdateOnTextChangedBehavior/>
    </i:Interaction.Behaviors>
    </TextBox>

    UpdateOnTextChangedBehavior 类:
        public class UpdateOnTextChangedBehavior : Behavior<TextBox>
    {
    protected override void OnAttached()
    {
    base.OnAttached();

    this.AssociatedObject.TextChanged +=
    new TextChangedEventHandler(AssociatedObject_TextChanged);
    }

    void AssociatedObject_TextChanged(object sender, TextChangedEventArgs e)
    {
    System.Diagnostics.Debug.WriteLine(((TextBox)sender).Text);
    BindingExpression binding =
    this.AssociatedObject.GetBindingExpression(TextBox.TextProperty);
    if (binding != null)
    {
    binding.UpdateSource();
    }
    }

    protected override void OnDetaching()
    {
    base.OnDetaching();

    this.AssociatedObject.TextChanged -=
    new TextChangedEventHandler(AssociatedObject_TextChanged);
    }
    }

    以上所做的是模仿桌面 WPF Binding 的行为。与 UpdateSourceTrigger=PropertyChanged ,这在 Silverlight 中是缺失的。那么,当您在文本框中输入 TextInViewModel 时会发生什么?属性将得到更新。此属性不必是 DependencyProperty ,它可能只是一个普通的 CLR 属性。

    关于silverlight - MVVM Light 太快 :),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2753010/

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