Caliburn Micro:如何设置绑定的UpdateSourceTrigger?

9
我一直在探索Caliburn Micro MVVM框架,只是为了体验一下它的感觉,但我遇到了一个小问题。我有一个绑定到ViewModel上的字符串属性的TextBox,并且我希望当TextBox失去焦点时更新该属性。
通常情况下,我会通过将UpdateSourceTrigger设置为LostFocus来实现此目的,但是我在Caliburn中没有找到任何方法来做到这一点,因为它已经自动为我设置了属性绑定。目前,每次TextBox的内容发生更改时,该属性都会被更新。
我的代码非常简单,例如这是我的VM:
public class ShellViewModel : PropertyChangeBase
{
    private string _name;

    public string Name
    {
        get { return _name; }
        set 
        { 
            _name = value; 
            NotifyOfPropertyChange(() => Name);
        }
    }
}

在我的视图中,我有一个简单的文本框。

<TextBox x:Name="Name" />

如何使名称属性仅在文本框失去焦点时更新,而不是每次属性更改时都更新?

1个回答

23

只需为该实例的TextBox显式设置绑定,Caliburn.Micro就不会对其进行处理:

<TextBox Text="{Binding Name, UpdateSourceTrigger=LostFocus}" />

如果您想改变所有TextBox实例的默认行为,那么您可以在引导程序的Configure方法中更改ConventionManager.ApplyUpdateSourceTrigger的实现。

具体操作如下:

protected override void Configure()
{
  ConventionManager.ApplyUpdateSourceTrigger = (bindableProperty, element, binding) =>{
#if SILVERLIGHT
            ApplySilverlightTriggers(
              element, 
              bindableProperty, 
              x => x.GetBindingExpression(bindableProperty),
              info,
              binding
            );
#else
            if (element is TextBox)
            {
                return;
            }

            binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
#endif
  };
}

1
好的,谢谢。我知道我可以始终回到使用常规方法,只是想知道是否有一种“Caliburn方式”来做到这一点。 - Alex McBride

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接