Пользователь контролирует общение с помощью команд - как? - PullRequest
0 голосов
/ 10 февраля 2012

Я работаю над своим первым проектом в WPF / XAML, и я многое еще не понял.

Моя проблема проста - мне нужно окно с множеством полей вtop, с помощью которого пользователь вводит свои критерии выбора, кнопку извлечения и сетку данных.Когда пользователь нажимает кнопку, запускается запрос, и результаты используются для заполнения сетки.

Теперь простой, очевидный и неправильный способ реализовать это состоит в том, чтобы иметь один модуль, содержащий одно окно.и иметь в нем все - поля ввода, сетку данных, работы.Такое распределение обязанностей приводит к неразрешимому беспорядку.

Итак, у меня есть окно, которое отвечает чуть больше, чем макет, которое содержит два пользовательских элемента управления - элемент управления критерием, который содержит поля ввода икнопка извлечения и элемент управления отображением данных, который содержит сетку данных.

Вопрос в том, как заставить эти два говорить друг с другом.

Несколько лет назад я бы добавил указатель на функциюкритерии контроля.Окно установило бы его так, чтобы оно указывало на функцию в элементе управления отображением, и когда кнопка была нажата, оно вызвало бы элемент управления отображением, пройдя критерии выбора.

Позже я бы добавилсобытие для контроля критериев.У меня было бы окно, устанавливающее обработчик в элементе управления дисплеем для прослушивания события, и когда кнопка была нажата, это вызвало бы событие.

Оба эти механизма работали бы в WPF.Но ни один не очень XAMLish.Мне кажется, что WPF предоставил интерфейс ICommand специально для решения подобных проблем с подключением, но я пока не совсем понял, как они должны работать.И ни один из примеров, которые я видел, не соответствует моему простому сценарию.

Кто-нибудь может дать мне несколько советов о том, как приспособить ICommand к этой проблеме?Или направить меня к приличному объяснению онлайн?

Спасибо!

1 Ответ

1 голос
/ 10 февраля 2012

MVVM - это распространенный шаблон, используемый при разработке WPF и Silverlight. Вы должны прочитать это.

По сути, у вас будет модель представления, которая предоставляет команду для выполнения поиска. Та же модель представления также предоставит свойства для каждого из ваших полей критериев. Представления будут привязаны к различным свойствам модели представления:

<TextBox Text="{Binding NameCriteria}"/>

...

<Button Command="{Binding SearchCommand}".../>

...

<DataGrid ItemsSource="{Binding Results}"/>

Где ваша модель вида будет выглядеть примерно так:

public class MyViewModel : ViewModel
{
    private readonly ICommand searchCommand;
    private string nameCriteria;

    public MyViewModel()
    {
        this.searchCommand = new DelegateCommand(this.OnSearch, this.CanSearch);
    }

    public ICommand SearchCommand
    {
        get { return this.searchCommand; }
    }

    public string NameCriteria
    {
        get { return this.nameCriteria; }
        set
        {
            if (this.nameCriteria != value)
            {
                this.nameCriteria = value;
                this.OnPropertyChanged(() => this.NameCriteria);
            }
        }
    }

    private void OnSearch()
    {
        // search logic, do in background with BackgroundWorker or TPL, then set Results property when done (omitted for brevity)
    }

    private bool CanSearch()
    {
        // whatever pre-conditions to searching you want here
        return !string.IsEmpty(this.NameCriteria);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...