Dans WPF, comment puis-je me lier au ViewModel et associer divers éléments XAML aux méthodes du ViewModel?

StackOverflow https://stackoverflow.com/questions/801889

  •  03-07-2019
  •  | 
  •  

Question

Je peux lier un ListBox comme ceci:

XAML:

<UserControl x:Class="TestDynamicForm123.Views.ViewCustomers"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <StackPanel Margin="10">
        <ListBox ItemsSource="{Binding}"/>
    </StackPanel>
</UserControl>

Code Derrière:

using System.Windows.Controls;
using TestDynamicForm123.ItemTypes;

namespace TestDynamicForm123.Views
{
    public partial class ViewCustomers : UserControl
    {
        public ViewCustomers()
        {
            InitializeComponent();

            DataContext = Customers.GetAll();
        }
    }
}

Voir le modèle:

using System.Collections.ObjectModel;

namespace TestDynamicForm123.ItemTypes
{
    class Customers : ItemTypes
    {
        protected ObservableCollection<Customer> collection;

        public static ObservableCollection<Customer> GetAll()
        {
            ObservableCollection<Customer> customers = new ObservableCollection<Customer>();
            customers.Add(new Customer() { FirstName = "Jay", LastName = "Anders", Age = 34 });
            customers.Add(new Customer() { FirstName = "Jim", LastName = "Smith", Age = 23 });
            customers.Add(new Customer() { FirstName = "John", LastName = "Jones", Age = 22 });
            customers.Add(new Customer() { FirstName = "Sue", LastName = "Anders", Age = 21 });
            customers.Add(new Customer() { FirstName = "Chet", LastName = "Rogers", Age = 35 });
            customers.Add(new Customer() { FirstName = "James", LastName = "Anders", Age = 37 });
            return customers;
        }
    }
}

Mais comment puis-je "le déplacer d'un niveau"? afin que je puisse dans le code situé derrière, lier aux clients eux-mêmes et, au sein de mon XAML, lier à différentes méthodes des clients , par exemple. GetAll () pour un ListBox et GetBest () pour un autre contrôle, etc.?

Je l'ai essayé avec cette syntaxe dans le code situé derrière:

DataContext = new Customers();

Et ces deux syntaxes dans le XAML mais ne fonctionnent pas:

<ListBox ItemsSource="{Binding GetAll}"/> (returns blank ListBox)
<ListBox ItemsSource="{Binding Source={StaticResource GetAll}}"/> (returns error)
Était-ce utile?

La solution

Vous devez utiliser ObjectDataProvider pour se lier à des méthodes, mais cela devrait être l'exception plutôt que la norme. Habituellement, votre machine virtuelle expose uniquement les propriétés que vous associez, y compris une propriété qui expose tous les Clients pertinents.

Autres conseils

Vous devez créer une classe de modèle de vue (CustomersViewModel) pour votre vue. CustomersViewModel exposera les données et la commande (interface ICommand) via des propriétés que votre vue (ViewCustomers) peut associer. Vous pouvez ensuite définir DataContext of ViewCustomers sur une instance de CustomersViewModel. Consultez l'article MSDN suivant sur le modèle Model-View-ViewModel dans WPF.

Applications WPF avec le modèle de conception Model-View-ViewModel

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top