En WPF, ¿cómo puedo enlazar con ViewModel y hacer que varios elementos XAML se unan a los métodos de ViewModel?

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

  •  03-07-2019
  •  | 
  •  

Pregunta

Puedo enlazar un ListBox como este:

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 detrás:

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

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

            DataContext = Customers.GetAll();
        }
    }
}

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

Pero, ¿cómo puedo " subirlo un nivel " por lo tanto, puedo en el código subyacente vincular a los Clientes y dentro de mi XAML enlazar a los Clientes varios métodos , por ejemplo. ¿GetAll () para un ListBox y GetBest () para otro control, etc.?

Lo intenté con esta sintaxis en el código detrás:

DataContext = new Customers();

Y estas dos sintaxis en el XAML pero ninguna funciona:

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

Solución

Debe usar ObjectDataProvider para enlazar a métodos, pero esa debería ser la excepción y no la norma. Por lo general, su máquina virtual solo expondrá las propiedades a las que se enlaza, incluida una propiedad que expone todos los Clientes relevantes.

Otros consejos

Debe crear una clase de modelo de vista (CustomersViewModel) para su vista. CustomersViewModel expondrá los datos y el comando (interfaz de ICommand) a través de las propiedades a las que se puede enlazar su vista (ViewCustomers). Luego, puede configurar DataContext de ViewCustomers en una instancia de CustomersViewModel. Echa un vistazo al siguiente artículo de MSDN sobre el modelo Model-View-ViewModel en WPF.

Aplicaciones de WPF con el patrón de diseño Model-View-ViewModel

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top