Overblog Suivre ce blog
Administration Créer mon blog

Présentation

  • : Romagny13 - Du .NET,du pur .NET
  • Romagny13 - Du .NET,du pur .NET
  • : Cycle de progression Faire (quelque chose qui marche) -> comprendre ce que l’on fait/comment cela marche -> pousser plus loin les notions
  • Contact

Recherche

Articles Récents

21 mars 2014 5 21 /03 /mars /2014 13:38

SQL Server Compact Toolbox est un add-in pour Visual Studio 2013,2012 et 2010 permettant de gérer facilement ses bases de données SQL Server compact depuis l’IDE .

 

http://visualstudiogallery.msdn.microsoft.com/0e313dfd-be80-4afb-b5e9-6e74d369f7a1

 


sqlserverce1.png

Repost 0
18 mars 2014 2 18 /03 /mars /2014 21:19

Exemple avec un treeView je récupère le schéma d’une base de données Sql Server .

J’affiche le nom des tables et en nœuds enfants les noms de colonnes .Le "level2" correspond aux noeuds enfants.  
<TreeView ItemsSource="{Binding Database.Tables}" >
                    <TreeView.Resources>
                        <DataTemplate x:Key="level2">
                            <TextBlock Text="{Binding ColumnName}" />
                        </DataTemplate>
                    </TreeView.Resources>
 
                    <TreeView.ItemTemplate>
                        <HierarchicalDataTemplate ItemsSource="{Binding Columns}" ItemTemplate="{StaticResource level2}" >
                            <TextBlock Text="{Binding TableName}" />
                        </HierarchicalDataTemplate>
                    </TreeView.ItemTemplate>
</TreeView>

 

 

 

Repost 0
Published by Romagny13 - dans Xaml
commenter cet article
10 mars 2014 1 10 /03 /mars /2014 12:58

RelayCommand

public class RelayCommand : ICommand
    {
        readonly Action<object> _execute;
        readonly Predicate<object> _canExecute;
 
        public RelayCommand(Action<object> execute): this(execute, null){ }
        public RelayCommand(Action<object> execute, Predicate<object> canExecute)
        {
            if (execute == null) throw new ArgumentNullException("execute");
            _execute = execute;
            _canExecute = canExecute;
        }
 
        public bool CanExecute(object parameter)
        {
            return _canExecute == null ? true : _canExecute(parameter);
        }
        public event EventHandler CanExecuteChanged
        {
            add {CommandManager.RequerySuggested += value;}
            remove {CommandManager.RequerySuggested -= value;}
        }
        public void Execute(object parameter)
        {
            _execute(parameter);
        }
    }

 

Le bouton :
<Button Content="Supprimer" Command="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=DataContext.RemoveImageCommand}" CommandParameter="{Binding .}" />

 

  • Il faut spécifier la source de données car sinon cela va chercher la commande … dans l’observableCollection .Exemple si je mettais simplement  Command="{Binding RemoveImageCommand}"  cela irait chercher la commande à exécuter dans la collection de photos et non le ViewModel
  • CommandParameter : c’est l’objet à passer, ici j’envoie la photo courante ( {Binding .} et {Binding} c'est la même chose)

La listBox d’un userControl le bouton et l’ItemTemplate(simplifié pour la clarté de l'exemple) 

 

<ListBox  ItemsSource="{Binding Article.Photos}" >
                                <ListBox.ItemTemplate>
                                    <DataTemplate>
                                        <WrapPanel>
                                            <Image Source="{Binding Picture}" />
                                            <Button Content="Supprimer" Command="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=DataContext.RemoveImageCommand}" CommandParameter="{Binding .}" />
                                        </WrapPanel>
                                    </DataTemplate>
                                </ListBox.ItemTemplate>
                            </ListBox>

 

Dans le ViewModel (ArticleViewModel dans mon exemple)

 

        public RelayCommand RemoveImageCommand { get; private set; }
 
        protected override void InitializeCommands()
        {
            RemoveImageCommand = new RelayCommand(RemoveImage);           
        }
 
        public void RemoveImage(object image)
        {
            if (Article != null && image !=null)
            {
                if (dialogService.Confirm("Suppression d'image", "Voulez-vous supprimer l'image ? "))
                {
                    Article.Photos.Remove((PhotoModel)image); 
                }
            }
        }
 

 

Repost 0
Published by Romagny13 - dans MVVM
commenter cet article
9 mars 2014 7 09 /03 /mars /2014 00:46

1 – Task

         public async Task<List<Client>> GetAllAsync()
         {
             List<Client> clients = new List<Client>();
             using (SqlConnection connection = new SqlConnection(@"Data Source=.\SQLEXPRESS;Initial Catalog=dbDemo;Integrated Security=SSPI;"))
             {
                 await connection.OpenAsync();
 
                 using (SqlCommand command = connection.CreateCommand())
                 {
                     command.CommandText = "SELECT [Id],[Name],[Email],[CategoryId] FROM [dbo].[Client]";
                     using (SqlDataReader reader = await command.ExecuteReaderAsync())
                     {
                         while (await reader.ReadAsync())
                         {
                             Client client = new Client();
                             client.ClientID = reader["Id"] == DBNull.Value ? default(int) : int.Parse(reader["Id"].ToString());
                             client.ClientName = reader["Name"] == DBNull.Value ? default(string) : reader["Name"].ToString();
                             client.Email = reader["Email"] == DBNull.Value ? default(string) : reader["Email"].ToString();
                             client.CategoryID = reader["CategoryId"] == DBNull.Value ? default(int) : int.Parse(reader["CategoryId"].ToString());
                             clients.Add(client);
 
                         }
                     }
                 }
             }
             return clients;
         }

 

 Ne pas oublier async
        private async void button2_Click(object sender, EventArgs e)
        {
            IClientService<Client> clientService = new ClientService();
            List<Client> clients= await clientService.GetAllAsync();
 
            dataGridView1.DataSource = clients;
        }

 

2- WaitCallback

public class ClientService :IService

    {

        private SynchronizationContext synchronizationContext = SynchronizationContext.Current ?? new SynchronizationContext();

 

        public virtual bool GetAllAsync(Action<OperationResult<List<Client>>> callback)

        {

            // Le résultat comprenant l'objet ou l'erreur

            OperationResult<List<Client>> response = new OperationResult<List<Client>>();

 

            WaitCallback waitCallBack = param =>

            {

                try

                {

                    response.Result = GetAll();

                }

                catch(Exception ex)

                {

                    response.Error = ex;

                }

                finally { synchronizationContext.Post(d => callback((OperationResult<List<Client>>)d), response); }

            };

            return ThreadPool.QueueUserWorkItem(waitCallBack);

        }

 

        public List<Client> GetAll()

        {

            List<Client> result = new List<Client>();

            DbProviderFactory factory = DbProviderFactories.GetFactory("System.Data.SqlClient");

            using (DbConnection connection = factory.CreateConnection())

            {

                connection.ConnectionString = @"Data Source=.\SQLEXPRESS;Initial Catalog=dbDemo;Integrated Security=SSPI;";

                connection.Open();

 

                using (DbCommand command = connection.CreateCommand())

                {

                    command.CommandText = "select TOP 1000 Id,Name,Email from [dbo].[Client]";

                    using (DbDataReader reader = command.ExecuteReader())

                    {

                        while (reader.Read())

                        {

                            Client client = new Client();

                            client.ClientID = Convert.ToInt32(reader["Id"]);

                            client.ClientFullName = reader["Name"].ToString();

                            client.Email = reader["Email"].ToString();

 

                            result.Add(client);

                        }

                    }

                }

            }

            return result;

        }

}

 

OperationResult(contenant soit le résultat soit l'erreur)

  public interface IOperationResult

    {

        Exception Error { get; }

    }

    public interface IOperationResult<T> : IOperationResult

    {

        T Result { get; }

    }

    public class OperationResult : IOperationResult

    {

        public Exception Error

        {

            get;

            protected internal set;

        }

    }

    public class OperationResult<T> : OperationResult, IOperationResult<T>

    {

        public T Result

        {

            get;

            protected internal set;

        }

    }

 Client , une classe métier implémentant INotifyPropertyChanged

«Context »

public class Context :ObservedBase

    {

        private ObservableCollection<Client> _clients;

 

        public ObservableCollection<Client> Clients

        {

            get { return _clients; }

            set

            {

                _clients = value;

                RaisePropertyChanged<ObservableCollection<Client>>(() => Clients);

            }

        }

        private IService service;

 

        public Context()

        {

            this.service = new ClientService();

            service.GetAllAsync(Callback);

        }

 

        private void Callback(OperationResult<List<Client>> response)

        {

            Clients =new ObservableCollection<Client>(response.Result);

        }

}

 

Ou Méthode anonyme    

public Context()

        {

            this.service = new ClientService();

            service.GetAllAsync(

                (response) =>

                {

                    Clients =new ObservableCollection<Client>(response.Result);

                });

        }

 

 Il suffit ensuite de définir le datacontext et binder les controls sur les propriétés de Clients   

 

3 Ressources  

Task-based Asynchronous Pattern

await

Asynchronous
Repost 0
Published by Romagny13 - dans ADO.NET
commenter cet article
8 mars 2014 6 08 /03 /mars /2014 15:35

1-EntityState /Ajout d’entité au contexte
 
Exemple pour ajouter on peut :
dbTradingEntities context = new dbTradingEntities();
Article newArticle=new Article() { ArticleID = Guid.NewGuid(), ArticleName = "Superbe jeans", CategoryID = 1, CollectionID = 1, Description = "...", GenderName = "Homme", Reference = "ref 000", UnitPrice = 10.00m };

 
Soit
context.Article.Add(newArticle);
context.SaveChanges();  
Soit on définit l’entityState comme ajouté
context.Entry<Article>(newArticle).State = EntityState.Added;
context.SaveChanges();  
2- EntityState /Modification d’entité
 Article oldArticle = context.Article.Where(a=>a.ArticleID==new Guid("9E1ABF59-7E6F-42BF-8D6F-4C48E8E95863")).First<Article>();
  
oldArticle.ArticleName = "Joli jeans";
context.Article.Attach(oldArticle); // état unchanged malgré les modifications
//
context.Entry<Article>(oldArticle).State = EntityState.Modified; // change l'état et pourra être sauvé
  
context.SaveChanges();



+ marquer un élément comme à suprrimer
context.Entry<Article>(article).State = EntityState.Deleted;

 

 
3-DbEntityEntry/Obtenir les valeurs courantes,originales,l’état d’une entité ou propriété
DbEntityEntry<Article> entry = context.Entry(oldArticle);
 
entry.CurrentValues
entry.OriginalValues
entry.Entity.ArticleID
entry.State
context.Entry(oldArticle).Property(a => a.ArticleName).CurrentValue ;
context.Entry(oldArticle).Property(a => a.ArticleName).OriginalValue ;

 

var errors = context.Entry(oldArticle).Property(a => a.ArticleName).GetValidationErrors() ;

 

Savoir si une propriété a été modifiée ou la marquer comme modifiée ?
bool isModified = context.Entry(oldArticle).Property(a => a.ArticleName).IsModified;
// ou
bool isModified = context.Entry(oldArticle).Property("ArticleName").IsModified;
 
4-ObjectContext/Récupérer la clé primaire
Obtenir un objectContext
var objectContext = ((IObjectContextAdapter)context).ObjectContext;

 

EntityKey key = objectContext.ObjectStateManager.GetObjectStateEntry(entry.Entity).EntityKey;
  
MessageBox.Show("clé : " + key.EntityKeyValues[0].Key.ToString() + " ,valeur : " + key.EntityKeyValues[0].Value.ToString());

 

  
5-Récupérer les éléments « added,modified,deleted »
On ne peut récupérer les éléments ajoutés qu’avec la collection Local
foreach (Article article in context.Article)
            {
                switch (context.Entry<Article>(article).State)
                {
                    case EntityState.Modified:
                        break;
                    case EntityState.Deleted:
                        break;
 
                }
            }
            foreach (Article article in context.Article.Local)
            {
                switch (context.Entry<Article>(article).State)
                {
                    case EntityState.Added:
                        break;
                }
            }



Exemple : la méthode d’ajout, modification, suppression ne change rien (ajout local,changement de l’état,…)
Added
Article newArticle = new Article() { ArticleID = Guid.NewGuid(), ArticleName = "Test", CategoryID = 1, CollectionID = 1, Description = "...", GenderName = "Homme", Reference = "ref 000", UnitPrice = 10.00m };
//context.Article.Local.Add(newArticle);
//context.Article.Add(newArticle);
context.Entry<Article>(newArticle).State = EntityState.Added;

 

Modified

 

Article modifiedArticle = context.Article.Where(a => a.ArticleID == new Guid("7C6B7C65-79CA-473C-8243-357DF2E7A4EB")).First<Article>();

modifiedArticle.ArticleName = "nouveau nom d'article";

context.Entry<Article>(modifiedArticle).State = EntityState.Modified;



Deleted

 

Article article = context.Article.First();
//context.Article.Local.Remove(article);
context.Article.Remove(article);

 

 
6-Accès concurrentiels

 

7-SqlQuery et ExecuteSql
// requête select
var articles =context.Database.SqlQuery<string>("select [ArticleName] from [dbo].[Article]").ToList();

       

//
context.Database.ExecuteSqlCommand("DELETE FROM [dbo].[Article] where [ArticleID]='041D2ADC-61DC-487C-8E3B-62DB6BA383D0' ");

 

ressources
Repost 0
Published by Romagny13 - dans Entity Framework
commenter cet article
8 mars 2014 6 08 /03 /mars /2014 01:37

 

 

Exemple nous avons :

  •         une entité Article 
  •          un model ArticleModel     

On crée deux méthodes d’extension pour le mapping

 

public static class ArticleMapper

    {

        public static ArticleModel ToModel(this Article entity)

        {

            ArticleModel model = new ArticleModel()

            {

                ArticleID = entity.ArticleID,

                Reference=entity.Reference,

                ArticleName = entity.ArticleName,

                Description = entity.Description,

                GenderName = entity.GenderName,

 

            };

 

            return model;

        }

 

        public static Article ToEntity(this ArticleModel model)

        {

            Article entity = new Article()

            {

                ArticleID = model.ArticleID,

                Reference = model.Reference,

                ArticleName = model.ArticleName,

                Description = model.Description,

                GenderName = model.GenderName

            };

 

 

            return entity;

        }

    }

 

 

public interface IServiceBase<TModelBase,TEntity>

    {

        List<TModelBase> GetAll();

        TModelBase Add(TModelBase entity);

        TModelBase Update(TModelBase entity);

        TModelBase Remove(TModelBase entity);

        int SaveAll();

    }

public class ArticleEDMService : IServiceBase<ArticleModel, Article>

    {

        private dbTradingEntities db = new dbTradingEntities();

 

        public List<ArticleModel> GetAll()

        {

            // renvoie toutes les photos

            //var photos = db.Articles.Where(a => a.Photo.Any()).ToList();

 

            foreach (Article entity in db.Article)

            {

                // filtre

                entity.Photo = db.Photo.Where(photo => photo.Article.Any(article => article.ArticleID == entity.ArticleID)).ToList();

 

                entity.ArticleSizes = db.ArticleSizes.Where(articleSize => articleSize.Article.ArticleID == entity.ArticleID).ToList();

            }

 

            return MapToModel(db.Article);

        }

        protected virtual List<ArticleModel> MapToModel(DbSet<Article> articles)

        {

            List<ArticleModel> result = new List<ArticleModel>();

 

            foreach (Article article in articles)

                result.Add(article.ToModel());

 

            return result;

        }

        // ......

}

 

  Include
 Exemple chargement des photos de l’article
 

var articles = context.Article.Include(a=>a.Photo).ToList();

 

Chargement explicite
context.Entry(oldArticleClone).Collection(a=>a .Photo).Load();
   
       

On peut remarquer que les data annotations + IDataErrorInfo marchent en windows form    

Il est intéressant également de voir que le binding se fait bien avec une liste ou une bindinglist et on peut sauver les changements facilement .Ce qui n’est pas le cas si on utilise le mapping qui demande un peu plus de code et de gérer l’objectContext

     

Repost 0
Published by Romagny13 - dans Entity Framework
commenter cet article
4 mars 2014 2 04 /03 /mars /2014 20:40
  • Permet de « centraliser l’ensemble des services de l’application » (les services du Model)
  • Un peu comme le ViewModelLocator qui lui s’occupe du ViewModel
Enregistrement des services :
App.xaml.cs
  protected override void OnStartup(StartupEventArgs e)
        {
 
            base.OnStartup(e);
 
            RegisterServices();
            RegisterViewModels();
 
        }
        private void RegisterServices()
        {
            ServiceLocator.Instance.Register<IMessenger>(new Messenger());
            ServiceLocator.Instance.Register<IArticleService>(new ArticleService());
            ServiceLocator.Instance.Register<ICollectionService>(new CollectionService());
            ServiceLocator.Instance.Register<IColorService>(new ColorService());
            ServiceLocator.Instance.Register<IPhotoService>(new PhotoService());
            ServiceLocator.Instance.Register<ISizeService>(new SizeService());
            ServiceLocator.Instance.Register<IGenderService>(new GenderService());
            ServiceLocator.Instance.Register<ICategoryService>(new CategoryService());
        }
        private void RegisterViewModels()
        {
            ViewModelLocator.Register(new ArticleListViewModel());
            ViewModelLocator.Register(new ArticleViewModel());
            ViewModelLocator.Register(new FilterViewModel());
            // . . .
        }

 

Retrouver un service depuis un ViewModel
       private IMessenger messenger;
       private IArticleService articleService;
 
        // . . .
        protected override void InitializeServices()
        {
            messenger = ServiceLocator.Instance.Retrieve<IMessenger>();
            articleService = ServiceLocator.Instance.Retrieve<IArticleService>();
        }

Utiliser un service .Il est possible ensuite d’utiliser ce même service .

public class ServiceLocator
    {     
        // Singleton
        private static readonly ServiceLocator instance = new ServiceLocator();
 
        public static ServiceLocator Instance
        {
            get { return instance; }
        }
 
        private Dictionary<Type, object> container = new Dictionary<Type, object>();
 
        public void Register<T>(T element)
        {
            container.Add(typeof(T), element);
        }
 
        public T Retrieve<T>()
        {
            object item;
            if (container.TryGetValue(typeof(T), out item))
                return (T)item;
 
            return default(T);
        }
 
        public void Unregister<T>()
        {
            if (container.ContainsKey(typeof(T)))
            {
                container.Remove(typeof(T));
            }
        }
    }

 

Repost 0
Published by Romagny13 - dans MVVM
commenter cet article
3 mars 2014 1 03 /03 /mars /2014 17:23

L’interface - Contient une liste de membres à implémenter.
public interface IRepository<TModelBase>
    {
        List<TModelBase> GetAll();
    }

 

Le « manager »- On passe une classe Repository implémentant l’interface  dans le constructeur
public class RepositoryManager<TModelBase>
    {
        private IRepository<TModelBase> repository;
 
        public RepositoryManager(IRepository<TModelBase> repository)
        {
            this.repository = repository;
        }
 
        public List<TModelBase> getAll()
        {
            return repository.GetAll();
        }
    }

 

2 Classes exemples implémentant l’interface
public class ArticleRepository : IRepository<ArticleModel>
    {
        public List<ArticleModel> GetAll()
        {
            return new List<ArticleModel>() { new ArticleModel() { ArticleName = "Jean 1" }, new ArticleModel() { ArticleName = "Jean 2" } };
        }
 
    }
public class OtherArticleRepository : IRepository<ArticleModel>
    {
        public List<ArticleModel> GetAll()
        {
            return new List<ArticleModel>() { new ArticleModel() { ArticleName = "Blouson 1" }, new ArticleModel() { ArticleName = "Blouson 2" } };
        }
    }
public class ArticleModel
    {
        public string ArticleName { get; set; }
    }

 

Démonstration
Dans le premier cas ce sera une liste de « jeans »
Dans le second cas ce sera une liste de « blousons »
De cette façon on peut changer très facilement la source de données .Exemple on peut implémenter un repository allant chercher les informations dans un document Xml et un autre allant les chercher dans une base de données .
  IRepository<ArticleModel> repository;
 
        private void button1_Click(object sender, EventArgs e)
        {
            repository = new ArticleRepository();
            RepositoryManager<ArticleModel> repositoryManager = new RepositoryManager<ArticleModel>(repository);
 
            dataGridView1.DataSource = repositoryManager.getAll();
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            repository = new OtherArticleRepository();
            RepositoryManager<ArticleModel> repositoryManager = new RepositoryManager<ArticleModel>(repository);
 
            dataGridView1.DataSource = repositoryManager.getAll();
        }

 

Repost 0
Published by Romagny13 - dans Design patterns
commenter cet article
2 mars 2014 7 02 /03 /mars /2014 20:03

1 ViewModelLocator "simple"

Exemple

  public class ViewModelLocator
    {
        public MainViewModel MainViewModel { get; set; }   
        public ArticleListViewModel ArticleListViewModel { get; set; }
        public ArticleDetailsViewModel ArticleDetailsViewModel { get; set; }
 
        public ViewModelLocator()
        {
            MainViewModel = new MainViewModel();
            ArticleListViewModel = new  ArticleListViewModel();
            ArticleDetailsViewModel = new ArticleDetailsViewModel();
        }
    }

Puis dans App.xaml

<Application x:Class="MVVMExample.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:ViewModels="clr-namespace:MVVMExample.ViewModels"
             xmlns:Framework="clr-namespace:MVVMExample.Framework"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
        <ResourceDictionary>
 
            <!-- etc. -->
            <Framework:ViewModelLocator x:Key="viewModelLocator"/>
        </ResourceDictionary>
    </Application.Resources>
</Application>

Utilisation

 <Views:ArticleListView DataContext="{Binding ArticleListViewModel, Source={StaticResource viewModelLocator}}" />

 

2-Un ViewModelLocator générique
« Framework » (dossier ou projet)
public class ViewModelLocator
    {
        private readonly static Dictionary<string, ViewModelBase>cache = new Dictionary<string, ViewModelBase>();
 
        public ViewModelBase this[string key]
        {
            get
            {
                ViewModelBase viewModel;
                cache.TryGetValue(key, out viewModel);
                return viewModel;
            }
        }
        public static void Register(string key, ViewModelBase viewModel)
        {
            cache.Add(key, viewModel);
        }
        public static void Register(ViewModelBase viewModel)
        {
            Register(viewModel.GetType().Name, viewModel);
        }      
        public static void Register<TViewModel>(ViewModelBase viewModel)
        {
            Register(typeof(TViewModel).Name, viewModel);
        }      
    }

 

App.xaml.cs
On enregistre les ViewModel
public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);
 
            RegisterViewModels();
        }
        private void RegisterViewModels()
        {
            ViewModelLocator.Register(new MainViewModel());
            ViewModelLocator.Register(new ArticleListViewModel());
            ViewModelLocator.Register(new ArticleDetailsViewModel());
        }
    }

 

App.xaml
<Framework:ViewModelLocator x:Key="viewModelLocator"/>

 

Utilisation
<Views:ArticleListView DataContext="{Binding .[ArticleListViewModel], Source={StaticResource viewModelLocator}}" />

 

Repost 0
Published by Romagny13 - dans MVVM
commenter cet article
1 mars 2014 6 01 /03 /mars /2014 12:34

1 – Ajout d’un dictionnaire de  ressources (Styles,DataTemplates,Brushes,Converters,Fonts,etc.)Exemple : Styles.xaml (ajouté dans un répertoire Ressources)



2 – Ajout d’un style
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
 
    <Style x:Key="TextBoxInError"  TargetType="{x:Type TextBox}">
        <Style.Triggers>
            <Trigger Property="Validation.HasError" Value="true">
                <Setter Property="ToolTip" Value="{Binding (Validation.Errors)[0].ErrorContent, RelativeSource={RelativeSource Self}}"/>
            </Trigger>
        </Style.Triggers>
    </Style>
 
</ResourceDictionary>

 

Remarque : si je n’ajoute pas de clé au Style celui-ci sera automatiquement appliqué à toutes les textBox de l’application
  
3- App.xaml
<Application x:Class="MVVMMediatorDemo.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
       
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/DataTemplates/DataTemplates.xaml" />
                 <ResourceDictionary Source="/Ressources/Styles.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
       
    </Application.Resources>
</Application>

 

4- Utilisation du style
<TextBox Text="{Binding CurrentClient.Name, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" Style="{DynamicResource TextBoxInError}"/>

 

5- Plus loin          

 On peut aussi définir les ViewModels par exemple (App.xaml)

<Application x:Class="MVVMMediatorDemo.App"          
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="MainWindow.xaml"
             xmlns:vm="clr-namespace:MVVMMediatorDemo.ViewModels"
             >
    <Application.Resources>
       
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/DataTemplates/DataTemplates.xaml" />
                <ResourceDictionary Source="/Ressources/Styles.xaml" />
            </ResourceDictionary.MergedDictionaries>
           
            <vm:ClientListViewModel x:Key="clientListViewModel"/>
           
        </ResourceDictionary>
    </Application.Resources> 
</Application>                    

 

 Puis définir le DataContext
<Window x:Class="MVVMMediatorDemo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:Views="clr-namespace:MVVMMediatorDemo.Views"
        Title="MainWindow" Height="300" Width="500">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="180"/>
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
        <Views:ClientListView Grid.Column="0" DataContext="{DynamicResource clientListViewModel}" />
        <Views:ClientDetailsView  Grid.Column="1" />
    </Grid>
</Window>

 

Repost 0
Published by Romagny13 - dans Xaml
commenter cet article