在文本框mvvm windows phone 8中检测到文本已更改?

时间:2013-11-17 06:52:06

标签: c# mvvm windows-phone-8

在使用mvvm时,如何在Windows Phone 8应用程序的文本框中键入文本时检测更改,但请注意我没有使用mvvmlight。

我尝试过使用interaction.Triggers,每当我输入一些文本时触发事件,绑定到控件的模型都不会在我的viewmodel中设置控件的Text属性。

我的viewModel有一个允许访问实际Model的属性,通常我会:

<TextBox Text={Binding Person.Title, Mode=TwoWay}"

但是为了测试,我刚刚在我的ViewModel中创建了一个Title属性,但行为相同。

我非常确定Text属性是正确绑定的,因为当我的视图被初始化并且它被调用时我已经放置了断点。

这是我的代码,每次输入时都会触发一个事件,但不幸的是,我的标题似乎永远不会被设置。

<TextBox Text="{Binding Title, Mode=TwoWay}" Grid.Row="1">
  <i:Interaction.Triggers>
    <i:EventTrigger EventName="TextChanged">
      <i:InvokeCommandAction Command="{Binding TitleTextChanged, Mode=OneWay}" CommandParameter="{Binding}" />
    </i:EventTrigger>
  </i:Interaction.Triggers>
</TextBox>

有什么想法吗?

感谢。

更新

更改的属性肯定是从我的ViewModel使用

引发的
public string Title
{
    get { return this._title; }
    set { if (this._title != value) this.SetProperty(ref this._title, value); }
}

但如前所述,我只添加了此属性来测试属性更改事件,因为我通常会通过我的ViewModel以这种方式访问​​我的模型对象:

public PersonModel CurrentPerson
{
    get { return this._currentPerson; }
    set { if (this._currentPerson != value) this.SetProperty(ref this._currentPerson, value);}
}

我希望这会澄清一些事情。

感谢。

3 个答案:

答案 0 :(得分:1)

<TextBox Text="{Binding TextInViewModel, Mode=TwoWay, 
                UpdateSourceTrigger=PropertyChanged}"/>

答案 1 :(得分:0)

一些想法......你是否改变了财产? mvvm-light帮助你做到这一点,没有它,你需要手动执行此操作。

你可以发布你房产的代码,但我猜想这就是问题所在。

另外,你说你将视图绑定到更改视图模型的模型......它听起来像汤......你查看绑定到视图模型。你看模型是你的模型和你的观点之间的桥梁(不应该知道你的观点,但它可以帮助你从模型中得到你需要的东西)。

答案 2 :(得分:0)

要在文本框中键入文本时检测更改,请使用Prism中的行为。

在xaml:

<TextBox Text="{Binding Path=Name, Mode=TwoWay}">
      <i:Interaction.Behaviors>
            <extensions:UpdateTextBindingOnPropertyChanged />
      </i:Interaction.Behaviors>
</TextBox>

行为代码(UpdateTextBindingOnPropertyChangedBehavior.cs):

using System;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Interactivity;

namespace MyApp.Extensions
{
/// <summary>
/// Custom behavior that updates the source of a binding on a text box as the text changes.
/// </summary>
public class UpdateTextBindingOnPropertyChanged : Behavior<TextBox>
{
  private BindingExpression _expression;

  /// <summary>
  /// Called after the behavior is attached to an AssociatedObject.
  /// </summary>
  /// <remarks>
  /// Override this to hook up functionality to the AssociatedObject.
  /// </remarks>
  protected override void OnAttached()
  {
    base.OnAttached();
    _expression = AssociatedObject.GetBindingExpression(TextBox.TextProperty);
    AssociatedObject.TextChanged += new TextChangedEventHandler(this.OnTextChanged);
  }

  /// <summary>
  /// Called when the behavior is being detached from its AssociatedObject, but before it has actually occurred.
  /// </summary>
  /// <remarks>
  /// Override this to unhook functionality from the AssociatedObject.
  /// </remarks>
  protected override void OnDetaching()
  {
    base.OnDetaching();
    AssociatedObject.TextChanged -= new TextChangedEventHandler(this.OnTextChanged);
    _expression = (BindingExpression) null;
  }

  private void OnTextChanged(object sender, EventArgs args)
  {
    _expression.UpdateSource();
  }
}
}

您需要将System.Windows.Interactivity.dll添加到项目中。每当控件TextChanged事件触发时,此行为将调用binded属性setter。效果很好(如果你没有设置Mode = TwoWay)。