В WPF как я могу привязаться к ViewModel и сделать так, чтобы различные элементы XAML связывались с методами ViewModel? - PullRequest
1 голос
/ 29 апреля 2009

Я могу связать ListBox следующим образом:

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>

Код сзади:

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

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

            DataContext = Customers.GetAll();
        }
    }
}

Просмотр модели:

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

Но как мне «поднять это на уровень», чтобы я мог в коде привязки к самим Клиентам и в моем XAML привязке к Клиентам различными методами , например, GetAll () для ListBox и GetBest () для другого элемента управления и т. Д .?

Я попробовал это с этим синтаксисом в коде:

DataContext = new Customers();

И эти два синтаксиса в XAML, но ни один из них не работает:

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

Ответы [ 2 ]

4 голосов
/ 29 апреля 2009

Вам необходимо использовать ObjectDataProvider для привязки к методам, но это должно быть скорее исключением, чем нормой. Обычно ваша виртуальная машина просто предоставляет свойства, к которым вы привязаны, в том числе свойство, предоставляющее все соответствующие Customer s.

1 голос
/ 29 апреля 2009

Вам необходимо создать класс модели представления (CustomersViewModel) для вашего представления. CustomersViewModel будет предоставлять данные и команду (интерфейс ICommand) через свойства, с которыми может связываться ваше представление (ViewCustomers). Затем вы можете установить DataContext из ViewCustomers для экземпляра CustomersViewModel. Ознакомьтесь со следующей статьей MSDN по шаблону Model-View-ViewModel в WPF.

Приложения WPF с шаблоном проектирования Model-View-ViewModel

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...