Em WPF como posso ligar para o ViewModel e tem vários elementos XAML ligar-se a métodos do ViewModel?

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

  •  03-07-2019
  •  | 
  •  

Pergunta

Eu posso vincular uma caixa de listagem como esta:

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>

Código Behind:

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

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

            DataContext = Customers.GetAll();
        }
    }
}

Exibição Modelo:

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

Mas como eu "movê-lo para um nível acima" para que eu possa no código por trás ligam a si mesmo e dentro do meu XAML clientes ligam a clientes de vários métodos , por exemplo, GetAll () para uma caixa de listagem e GetBest () para outro controle, etc.?

Eu tentei com esta sintaxe no código por trás:

DataContext = new Customers();

E essas duas sintaxes no XAML, mas nem trabalho:

<ListBox ItemsSource="{Binding GetAll}"/> (returns blank ListBox)
<ListBox ItemsSource="{Binding Source={StaticResource GetAll}}"/> (returns error)
Foi útil?

Solução

Você precisa usar ObjectDataProvider para se ligar a métodos, mas que deve ser a excepção e não a regra. Normalmente, o seu VM só iria expor propriedades que se ligam a, incluindo uma propriedade que expõe todos os Customers relevantes.

Outras dicas

Você precisa criar uma classe de vista do modelo (CustomersViewModel) para o seu ponto de vista. CustomersViewModel irá expor os dados e o comando (de interface ICommand) através de propriedades que o seu ponto de vista (ViewCustomers) podem ligar para. Você pode então definir DataContext de ViewCustomers a uma instância do CustomersViewModel. Confira o seguinte artigo MSDN sobre o padrão Model-View-ViewModel no WPF.

WPF Apps com o Model-View-ViewModel Design Pattern

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top