我有很多字段由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中不存在的行为。
答案 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]}" />