In WPF come posso associare ViewModel e fare in modo che vari elementi XAML si associno ai metodi di ViewModel?

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

  •  03-07-2019
  •  | 
  •  

Domanda

Posso associare un ListBox in questo modo:

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>

Codice dietro:

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

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

            DataContext = Customers.GetAll();
        }
    }
}

Visualizza modello:

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;
        }
    }
}

Ma come posso spostarlo di livello superiore? così posso nel codice dietro legare ai Clienti stessi e all'interno del mio XAML legare a Clienti vari metodi , ad es. GetAll () per un ListBox e GetBest () per un altro controllo, ecc.?

L'ho provato con questa sintassi nel codice dietro:

DataContext = new Customers();

E queste due sintassi in XAML ma nessuna delle due funziona:

<ListBox ItemsSource="{Binding GetAll}"/> (returns blank ListBox)
<ListBox ItemsSource="{Binding Source={StaticResource GetAll}}"/> (returns error)
È stato utile?

Soluzione

Devi utilizzare ObjectDataProvider per legarsi ai metodi, ma questa dovrebbe essere l'eccezione piuttosto che la norma. Di solito la VM espone solo le proprietà a cui ti colleghi, inclusa una proprietà che espone tutti i Clienti pertinenti.

Altri suggerimenti

È necessario creare una classe del modello di vista (ClientiViewModel) per la vista. ClientiViewModel esporrà i dati e il comando (interfaccia ICommand) tramite le proprietà che la vista (ViewCustomers) può associare. È quindi possibile impostare DataContext di ViewCustomers su un'istanza di CustomersViewModel. Consulta il seguente articolo MSDN sul modello Model-View-ViewModel in WPF.

App WPF con il modello di progettazione Model-View-ViewModel

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top