Back to Devexpress

MetadataLocator Class

corelibraries-devexpress-dot-mvvm-dot-dataannotations-adfdff41.md

latest12.4 KB
Original Source

MetadataLocator Class

Allows you to register metadata classes.

Namespace : DevExpress.Mvvm.DataAnnotations

Assembly : DevExpress.Mvvm.v25.2.dll

NuGet Packages : DevExpress.Mvvm, DevExpress.Win.Navigation

Declaration

csharp
public class MetadataLocator :
    IMetadataLocator
vb
Public Class MetadataLocator
    Implements IMetadataLocator

The following members return MetadataLocator objects:

Remarks

The example below illustrates how to register metadata for a generic type.

csharp
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:

  • DisplayFormat
  • NumericMask
  • DateTimeMask
  • RegExMask

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:

csharp
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:

csharp
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.

csharp
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;
        }
    }
}
xaml
<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>
vb
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

Implements

IMetadataLocator

Inheritance

Object MetadataLocator

See Also

MetadataLocator Members

DevExpress.Mvvm.DataAnnotations Namespace