Frage

Ich versuche, meine Ansicht meiner Ansicht Modell ohne DataObjectProvider zu binden.

Die folgende Code ausgeführt wird, ohne einen Fehler , aber meine ListBox ist leer .

Soweit ich sagen kann, ich richtig:

  • die Anzeige für den Datacontext auf das Ansichtsmodell gesetzt selbst (DataContext = new CustomersViewModel();)
  • setzt die Kundenobjekte im Ansichtsmodell (public static ObservableCollection<Customer> GetAll())
  • binden, um die List-Box an die Kundenobjekte (ItemsSource="{Binding GetAll}")

Was kleines Stück Syntax mir fehlt hier?

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: (Modell)

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

    }
}
War es hilfreich?

Lösung

Das Problem ist, dass Sie CustomerViewModel.GetAll zu binden versuchen (), wenn GetAll in CustomerViewModel eine statische Funktion keine Instanz Eigenschaft ist.

Ändern Sie die statische Funktion zu so etwas wie dieses (in CustomerViewModel):

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

Andere Tipps

Das Problem ist, dass CustomersViewModel .GetAll() eine statische Methode ist. nur Bindung arbeitet mit Instanzeigenschaften. Sie sollten die Implementierung von GetAll() an den Konstruktor bewegen, und dann die Sammlung als eine Instanz Eigenschaft der Klasse aus.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top