Есть ли простой способ привязать команду к списку в MVVM WPF? - PullRequest
3 голосов
/ 28 июля 2011

Я пытался создать довольно простое приложение в WPF, следуя паттерну разработки MVVM, но я сходил с ума от того, насколько трудным кажется делать простые вещи.Я уже создал это приложение в Forms и успешно запустил его, но мой начальник попросил переписать интерфейс в WPF в качестве демонстрации технологии.Я решил постараться следовать как можно большему количеству лучших практик, чтобы приложение и код были максимально понятными.Моя текущая дилемма использует список для запуска некоторого кода каждый раз, когда выбор изменяется.Я готов просто использовать программный код с событием для вызова метода в модели представления.Мне кажется, это все еще по сути MVVM, поскольку никакой логики не выполняется.Спасибо за любую помощь / понимание.

Ответы [ 5 ]

2 голосов
/ 28 июля 2011

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

Вот пример, которыйпоможет вам

XAML

  <Grid Canvas.Left="0" Canvas.Bottom="0" Height="300" Width="300" Background="Bisque">
            <ListBox ItemsSource="{Binding Employes}" SelectedItem="{Binding SelectedEmploye}"/>
        </Grid>

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

public  class ViewModel : ViewModelBase
    {
        private List<Employee> _employes;

        public List<Employee> Employes
        {
            get { return _employes; }
            set { _employees = value; OnPropertyChanged("Employes"); }
        }
        private Employee _selectedEmploye;

        public Employee SelectedEmploye
        {
            get { return _selectedEmploye; }
            set
            {
                _selectedEmployee = value;
                OnPropertyChanged("SelectedEmploye");
            }
        }

    }

Просмотр модели базы

public  class ViewModelBase : INotifyPropertyChanged
    {
        protected virtual void OnPropertyChanged(string propertyName)
        {
            if (this.PropertyChanged != null)
            {
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
        public event PropertyChangedEventHandler PropertyChanged;
    }

Класс сотрудника

public class Employee : ViewModelBase
    {
        private string _name;
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }
    }
2 голосов
/ 28 июля 2011

В вашей ViewModel вы можете создать свойство "SelectedItem".Затем привяжите свойство SelectedItem, если ваш ListBox к вашему свойству.

  • Если это clr-свойство POCO (INotifyPropertyChanged), то вы можете запустить свой код из установщика свойств.
  • Если это свойство DependencyProperty, вы должны добавить PropertyChangedCallback и вызватьваш код оттуда.
1 голос
/ 28 июля 2011

Не бойтесь использовать код-позади. Отсутствие выделенного кода - это руководство, позволяющее избежать слишком большой логики в представлении, а не жесткое и быстрое правило. В этом случае (как предлагали другие) вы можете привязать свойство SelectedItem к какому-либо свойству вашей модели представления. В случае событий, не связанных с данными, я бы рекомендовал обрабатывать событие как обычно и делегировать логику выполнения модели представления.

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

0 голосов
/ 28 июля 2011

вы можете привязать к ListBox.SelectedItem, чтобы получить выбранный элемент в вашем виртуальном компьютере.

0 голосов
/ 28 июля 2011

Оформление поведения EventToCommand в Galasoft MVVM Light

Вот ТАК сообщение

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