根据Linq To SQL中绑定的字段设置Windows Phone TextBox的MaxLength

时间:2013-11-27 00:27:37

标签: c# xaml linq-to-sql windows-phone-8

我有很多字段由SQLMetal为我的WP Linq to SQL数据库创建,其数据类型为nvarchar(##)。如何在XAML中使用数据类型的长度来设置UI文本框的MaxLength?

我真的不想在我的UI代码中修复长度,所以如果我的架构发生变化,我必须记得在两个位置修改它。

我99%确定如果我的文本框是在控件中构建的,或者是从Telerik构建的,那么它没有任何区别。

Linq to SQL字段:

[global::System.Data.Linq.Mapping.ColumnAttribute(Storage = "_Title", DbType = "NVarChar(50)", UpdateCheck = UpdateCheck.Never)]
public string Title
{
    get
    {
        return this._Title;
    }
    set
    {
        if ((this._Title != value))
        {
            this.OnTitleChanging(value);
            this.SendPropertyChanging();
            this._Title = value;
            this.SendPropertyChanged("Title");
            this.OnTitleChanged();
        }
    }
}

Windows Phone 8 XAML:

<telerikPrimitives:RadTextBox x:Name="titleTextBox" Header="Title" 
                              MaxLength="50"
                              HeaderStyle="{StaticResource HeaderAccentStyle}"
                              Text="{Binding Title, Mode=TwoWay}" Grid.Row ="0"/>

我看过几个WPF答案,但是他们使用了WP中不存在的行为。

1 个答案:

答案 0 :(得分:0)

不确定它是否适用于您的情况,但您可以创建Dictionary属性名称和长度值,并将其绑定在Xaml

在这个示例中,我只使用DefaultValueAttribute,因为我没有System.Data.Linq.Mapping.ColumnAttribute,但同样的想法会起作用

   private Dictionary<string, int> _maxlengthValues;
   public Dictionary<string, int> MaxLengthValues
   {
       get
       {
           if (_maxlengthValues == null)
           {
             // horrible example, but does the job
            _maxlengthValues =  this.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public)
                   .ToDictionary(n => n.Name, p => p.GetCustomAttributes(typeof(DefaultValueAttribute), false))
                   .Where(p => p.Value != null && p.Value.Any() && (p.Value[0] as DefaultValueAttribute).Value != null)
                   .ToDictionary(k => k.Key, v=>(int)(v.Value[0] as DefaultValueAttribute).Value);
           }
           return _maxlengthValues;
       }
   }


  [DefaultValue(20)] // 20 char limit
  public string TestString
  {
      get { return _testString; }
      set { _testString = value; NotifyPropertyChanged("TestString"); }
  }

的Xaml:

<TextBox Text="{Binding TestString}" MaxLength="{Binding MaxLengthValues[TestString]}" />