Xamarin表单行为没有附加

时间:2018-02-15 18:43:37

标签: xamarin xamarin.forms

我编写了一个非常简单的Xamarin Forms Behavior来设置Entry的最大长度。但是,它没有附加。 OnAttach代码不会执行。这是我写的第一个行为。

我有一个OnAttachedTo和OnDetachedFrom。

public class MaxLengthBehavior : Behavior<Entry>
{
    public static readonly BindableProperty MaxLengthProperty = BindableProperty.Create("MaxLength", typeof(int), typeof(MaxLengthBehavior), 0);

    public int MaxLength
    {
        get { return (int)GetValue(MaxLengthProperty); }
        set { SetValue(MaxLengthProperty, value); }
    }

    private void bindable_TextChanged(object sender, TextChangedEventArgs e)
    {

        if (e.NewTextValue.Length >= MaxLength)
            ((Entry)sender).Text = e.NewTextValue.Substring(0, MaxLength);
    }

    protected override void OnAttachedTo(Entry bindable)
    {
        bindable.TextChanged += bindable_TextChanged;
    }

    protected override void OnDetachingFrom(Entry bindable)
    {
        bindable.TextChanged -= bindable_TextChanged;
    }
}

我使用Xaml附加到条目。

<Entry x:Name="entryName" Margin="35, 20, 35, 9" 
     Placeholder="What's your name?" 
     Text="{Binding Name}">
  <Entry.Behaviors>
      <b:MaxLengthBehavior MaxLength="22" />
  </Entry.Behaviors>
</Entry>

我确信我一定做错了。但是,我没有看到它。

感谢。

2 个答案:

答案 0 :(得分:0)

我会发布我使用的内容,也许会有所帮助。这至少对我有用。主要区别在于MaxLength不是BindableProperty。

 public class EntryLengthValidatorBehavior : Behavior<Entry>
{
    public int MaxLength { get; set; }

    protected override void OnAttachedTo(Entry bindable)
    {
        base.OnAttachedTo(bindable);
        bindable.TextChanged += OnEntryTextChanged;
    }

    protected override void OnDetachingFrom(Entry bindable)
    {
        base.OnDetachingFrom(bindable);
        bindable.TextChanged -= OnEntryTextChanged;
    }

    void OnEntryTextChanged(object sender, TextChangedEventArgs e)
    {
        var entry = (Entry)sender;

        // if Entry text is longer then valid length
        if (entry.Text?.Length > this.MaxLength)
        {
            string entryText = entry.Text;

            entryText = entryText.Remove(entryText.Length - 1); // remove last char

            entry.Text = entryText;
        }
    }
}

和用法

<Entry Text="{Binding VatNumber}">
  <Entry.Behaviors>
    <behaviors:EntryLengthValidatorBehavior MaxLength="14" />
  </Entry.Behaviors>
</Entry>

答案 1 :(得分:0)

事实证明,这是VS for Mac的构建问题。我没有关闭VS或项目几天。关闭并重新打开VS for Mac修复了该问题。我真的开始不喜欢VS for Mac了。对于不仅仅是演示应用程序的解决方案,我感到非常奇怪。