2009-04-29 5 views
1

ich eine ListBox wie diese binden können:Wie kann ich in WPF an das ViewModel binden und verschiedene XAML-Elemente an die Methoden von ViewModel binden lassen?

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> 

-Code Behind:

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

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

      DataContext = Customers.GetAll(); 
     } 
    } 
} 

Ansicht Modell:

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

Aber wie kann ich es "eine Ebene höher", so kann ich in den Code hinter binden an Kunden selbst und in meinem XAML binden an Kunden verschiedene Methoden, z. GetAll() für eine ListBox und GetBest() für ein anderes Steuerelement usw.?

Ich versuchte es mit dieser Syntax in der Code-behind:

DataContext = new Customers(); 

Und diese beiden Syntaxen in der XAML aber weder Arbeit:

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

Antwort

4

Sie müssen ObjectDataProvider verwenden, um Methoden zu binden, aber das sollte eher die Ausnahme als die Norm sein. In der Regel würde Ihre VM nur Eigenschaften anzeigen, an die Sie binden, einschließlich einer Eigenschaft, die alle relevanten Customer s verfügbar macht.

+0

ich dachte, dass etwas war Object zu vermeiden, zusätzlich scheint es nicht in Silverlight zu sein, so würde ich einige Muster bekommen nach unten, ohne sie, so nahm ich es heraus, gebunden meine V meiner VM, legte die Daten offen, gebunden, aber es wird nicht angezeigt: http://stackoverflow.com/questions/802162/why-is-this-view-not-correctly-binding-to-this-viewmodel –

1

Sie müssen eine Sichtmodellklasse (CustomersViewModel) für Ihre Sicht erstellen. CustomersViewModel stellt die Daten und den Befehl (ICommand-Schnittstelle) über Eigenschaften zur Verfügung, an die Ihre Ansicht (ViewCustomers) binden kann. Sie können dann DataContext von ViewCustomers auf eine Instanz von CustomersViewModel setzen. Überprüfen Sie den folgenden MSDN-Artikel zu Model-View-ViewModel-Muster in WPF.

WPF Apps With The Model-View-ViewModel Design Pattern