corelibraries-devexpress-dot-mvvm-dot-dataannotations-adfdff41.md
Allows you to register metadata classes.
Namespace : DevExpress.Mvvm.DataAnnotations
Assembly : DevExpress.Mvvm.v25.2.dll
NuGet Packages : DevExpress.Mvvm, DevExpress.Win.Navigation
public class MetadataLocator :
IMetadataLocator
Public Class MetadataLocator
Implements IMetadataLocator
The following members return MetadataLocator objects:
The example below illustrates how to register metadata for a generic type.
using DevExpress.Mvvm.DataAnnotations;
using DevExpress.Mvvm.Native;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1 {
class Program {
static void Main(string[] args) {
MetadataLocator.Default = MetadataLocator.Create().AddMetadata(typeof(ReferenceDataItemViewModel<>), typeof(ReferenceDataItemViewModelMetadata<>));
var vm = new ReferenceDataItemViewModel<MyReferenceDataBaseItem>();
var attrs = MetadataHelper.GetExternalAndFluentAPIAttrbutes(vm.GetType(), "Code");
}
}
public class ReferenceDataBaseItem<T> where T : ReferenceDataBaseItem<T> {
}
public class MyReferenceDataBaseItem : ReferenceDataBaseItem<MyReferenceDataBaseItem> {
}
public class ReferenceDataItemBaseViewModel {
public string Code { get; set; }
public string Description { get; set; }
}
public class ReferenceDataItemViewModel<T> : ReferenceDataItemBaseViewModel where T : ReferenceDataBaseItem<T>, new() {
}
public class ReferenceDataItemViewModelMetadata<T> where T : ReferenceDataBaseItem<T>, new() {
public static void BuildMetadata(MetadataBuilder<ReferenceDataItemViewModel<T>> builder) {
builder.Property(x => x.Code).Required(() => "Code can't be empty");
builder.Property(x => x.Description).Required(() => "Description can't be empty");
}
}
}
This example demonstrates how to use the following attributes to influence columns generated by the GridControl:
You can also use the Fluent API mechanism instead of attributes. Create a class implementing the IMetadataProvider interface. In the IMetadataProvider.BuildMetadata method, assign required metadata:
void IMetadataProvider<Customer>.BuildMetadata(MetadataBuilder<Customer> builder)
{
builder.Property(p => p.ID).NumericMask("N0");
builder.Property(p => p.Name).DisplayFormatString("name is: {0}", true);
builder.Property(p => p.Phone).RegExMask(\@"\d{2}-\d{2}-\d{2}");
builder.Property(p => p.HiredAt).DateTimeMask("dd/MM/yyyy");
}
To register this metadata, use the following code:
MetadataLocator.Default = MetadataLocator.Create().AddMetadata(typeof(Customer), typeof(DataAnnotationsElement1Metadata));
With this approach, you don’t need to modify the model class code. This may be useful if you don’t have access to this class code.
using DevExpress.Mvvm.DataAnnotations;
using System;
using System.Collections.ObjectModel;
using System.ComponentModel.DataAnnotations;
using System.Windows;
namespace colGeneration
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
MetadataLocator.Default = MetadataLocator.Create().AddMetadata(typeof(Customer), typeof(DataAnnotationsElement1Metadata));
ObservableCollection<Customer> customers = new ObservableCollection<Customer>();
for (int i = 1; i < 10; i++)
{
customers.Add(new Customer() { ID = i, Name = "Name" + i, Phone = "00-00-0" + i % 10, HiredAt = DateTime.Now.AddDays(-i) });
}
grid.ItemsSource = customers;
ObservableCollection<Customer2> customers2 = new ObservableCollection<Customer2>();
for (int i = 1; i < 10; i++)
{
customers2.Add(new Customer2() { ID = i, Name = "Name" + i, Phone = "00-00-0" + i % 10, HiredAt = DateTime.Now.AddDays(-i) });
}
grid2.ItemsSource = customers2;
}
}
public class DataAnnotationsElement1Metadata : IMetadataProvider<Customer>
{
void IMetadataProvider<Customer>.BuildMetadata(MetadataBuilder<Customer> builder)
{
builder.Property(p => p.ID).NumericMask("N0");
builder.Property(p => p.Name).DisplayFormatString("name is: {0}", true);
builder.Property(p => p.Phone).RegExMask(@"\d{2}-\d{2}-\d{2}");
builder.Property(p => p.HiredAt).DateTimeMask("dd/MM/yyyy");
}
}
public class Customer
{
public int ID
{
get;
set;
}
public string Name
{
get;
set;
}
public string Phone
{
get;
set;
}
public DateTime HiredAt
{
get;
set;
}
}
public class Customer2
{
[NumericMask(Mask = "N0")]
public int ID
{
get;
set;
}
[DisplayFormat(DataFormatString = "name is: {0}")]
public string Name
{
get;
set;
}
[RegExMask(Mask = @"\d{2}-\d{2}-\d{2}")]
public string Phone
{
get;
set;
}
[DateTimeMask(Mask = "dd/MM/yyyy")]
public DateTime HiredAt
{
get;
set;
}
}
}
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:dxg="http://schemas.devexpress.com/winfx/2008/xaml/grid" x:Class="colGeneration.MainWindow"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<dxg:GridControl Name="grid" AutoGenerateColumns="AddNew" EnableSmartColumnsGeneration="True">
<dxg:GridControl.View>
<dxg:TableView Name="view" AutoWidth="True"/>
</dxg:GridControl.View>
</dxg:GridControl>
<dxg:GridControl Name="grid2" AutoGenerateColumns="AddNew" Grid.Column="1" EnableSmartColumnsGeneration="True">
<dxg:GridControl.View>
<dxg:TableView Name="view2" AutoWidth="True"/>
</dxg:GridControl.View>
</dxg:GridControl>
</Grid>
</Window>
Imports Microsoft.VisualBasic
Imports DevExpress.Xpf.Mvvm.DataAnnotations
Imports System
Imports System.Collections.ObjectModel
Imports System.ComponentModel.DataAnnotations
Imports System.Windows
Namespace colGeneration
Partial Public Class MainWindow
Inherits Window
Public Sub New()
InitializeComponent()
MetadataLocator.Default = MetadataLocator.Create().AddMetadata(GetType(Customer), GetType(DataAnnotationsElement1Metadata))
Dim customers As New ObservableCollection(Of Customer)()
For i As Integer = 1 To 9
customers.Add(New Customer() With {.ID = i, .Name = "Name" & i, .Phone = "00-00-0" & i Mod 10, .HiredAt = DateTime.Now.AddDays(-i)})
Next i
grid.ItemsSource = customers
Dim customers2 As New ObservableCollection(Of Customer2)()
For i As Integer = 1 To 9
customers2.Add(New Customer2() With {.ID = i, .Name = "Name" & i, .Phone = "00-00-0" & i Mod 10, .HiredAt = DateTime.Now.AddDays(-i)})
Next i
grid2.ItemsSource = customers2
End Sub
End Class
Public Class DataAnnotationsElement1Metadata
Implements IMetadataProvider(Of Customer)
Private Sub BuildMetadata(ByVal builder As MetadataBuilder(Of Customer)) Implements IMetadataProvider(Of Customer).BuildMetadata
builder.Property(Function(p) p.ID).NumericMask("N0")
builder.Property(Function(p) p.Name).DisplayFormatString("name is: {0}", True)
builder.Property(Function(p) p.Phone).RegExMask("\d{2}-\d{2}-\d{2}")
builder.Property(Function(p) p.HiredAt).DateTimeMask("dd/MM/yyyy")
End Sub
End Class
Public Class Customer
Private privateID As Integer
Public Property ID() As Integer
Get
Return privateID
End Get
Set(ByVal value As Integer)
privateID = value
End Set
End Property
Private privateName As String
Public Property Name() As String
Get
Return privateName
End Get
Set(ByVal value As String)
privateName = value
End Set
End Property
Private privatePhone As String
Public Property Phone() As String
Get
Return privatePhone
End Get
Set(ByVal value As String)
privatePhone = value
End Set
End Property
Private privateHiredAt As DateTime
Public Property HiredAt() As DateTime
Get
Return privateHiredAt
End Get
Set(ByVal value As DateTime)
privateHiredAt = value
End Set
End Property
End Class
Public Class Customer2
Private privateID As Integer
<NumericMask(Mask:="N0")> _
Public Property ID() As Integer
Get
Return privateID
End Get
Set(ByVal value As Integer)
privateID = value
End Set
End Property
Private privateName As String
<DisplayFormat(DataFormatString:="name is: {0}")> _
Public Property Name() As String
Get
Return privateName
End Get
Set(ByVal value As String)
privateName = value
End Set
End Property
Private privatePhone As String
<RegExMask(Mask:="\d{2}-\d{2}-\d{2}")> _
Public Property Phone() As String
Get
Return privatePhone
End Get
Set(ByVal value As String)
privatePhone = value
End Set
End Property
Private privateHiredAt As DateTime
<DateTimeMask(Mask:="dd/MM/yyyy")> _
Public Property HiredAt() As DateTime
Get
Return privateHiredAt
End Get
Set(ByVal value As DateTime)
privateHiredAt = value
End Set
End Property
End Class
End Namespace
Object MetadataLocator
See Also