Em WPF como posso ligar para o ViewModel e tem vários elementos XAML ligar-se a métodos do ViewModel?
-
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)
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 Customer
s 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.