Question

J'essaie de lier ma vue à mon modèle de vue sans DataObjectProvider.

Le code suivant est exécuté sans erreur , mais mon contrôle ListBox est vide .

Autant que je sache, j'ai correctement:

  • définir le DataContext de la vue sur le ViewModel lui-même (DataContext = new CustomersViewModel();)
  • exposer les objets client dans le ViewModel (public static ObservableCollection<Customer> GetAll())
  • lie le contrôle ListBox aux objets client (ItemsSource="{Binding GetAll}")

Quel morceau de syntaxe me manque ici?

CustomersView.xaml:

<UserControl x:Class="TestDynamicForm123.View.CustomersView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <UserControl.Resources>
        <Style x:Key="allCustomersListBox" TargetType="ListBox">
            <Setter Property="BorderThickness" Value="0"/>
        </Style>
        <DataTemplate x:Key="allCustomersDataTemplate">
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding FirstName}"/>
                <TextBlock Text=" "/>
                <TextBlock Text="{Binding LastName}"/>
            </StackPanel>
        </DataTemplate>
    </UserControl.Resources>

    <StackPanel Style="{StaticResource viewWrappingStackPanel}">
        <ListBox ItemsSource="{Binding GetAll}"
                 ItemTemplate="{StaticResource allCustomersDataTemplate}"
                 Style="{StaticResource allCustomersListBox}">
        </ListBox>
    </StackPanel>
</UserControl>

CustomersView.xaml.cs:

using System.Windows.Controls;
using TestDynamicForm123.ViewModel;

namespace TestDynamicForm123.View
{
    public partial class CustomersView : UserControl
    {
        public CustomersView()
        {
            InitializeComponent();

            DataContext = new CustomersViewModel();
        }
    }
}

CustomersViewModel.cs:

using System.Collections.ObjectModel;

namespace TestDynamicForm123.ViewModel
{
    public class CustomersViewModel
    {
        public static ObservableCollection<Customer> GetAll()
        {
            return Customer.GetAll();
        }
    }
}

Customer.cs: (modèle)

using System.Collections.ObjectModel;

namespace TestDynamicForm123.ViewModel
{
    public class Customer
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public int Age { get; set; }

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

    }
}
Était-ce utile?

La solution

Le problème est que vous essayez de vous lier à CustomerViewModel.GetAll (), lorsque GetAll dans CustomerViewModel est une fonction statique et non une propriété d'instance.

Modifiez la fonction statique comme suit (dans CustomerViewModel):

public ObservableCollection<Customer> GetAll
{
    get { return Customer.GetAll(); }
}

Autres conseils

Le problème est que CustomersViewModel .GetAll() est une méthode statique. La liaison ne fonctionne qu'avec les propriétés d'instance. Vous devez déplacer l'implémentation de GetAll() vers le constructeur, puis exposer la collection en tant que propriété d'instance de la classe.

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