WPF Listbox команды - PullRequest
       18

WPF Listbox команды

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

Хорошо, моя программа в двух словах имеет список клиентов. Все эти клиенты перечислены в списке, поэтому при нажатии на них вся их информация отображается в форме. Это работает через привязку данных, все элементы управления на странице привязаны к selectedItem списка.

То, что я хотел бы сделать сейчас, - это диалоговое окно с сообщением, спрашивающее, хочет ли пользователь сохранить при попытке изменить выбор. Если они не хотят, я хочу вернуть его обратно к исходному элементу в коллекции. Если они нажимают «Отмена», я хочу, чтобы выделение вернулось к ранее выбранному элементу. Мне интересно, как лучше всего сделать это в манере MVVM?

В настоящее время у меня есть модель для моего клиента, и моя виртуальная машина заполняет коллекцию клиентов, с которой связан список. Так есть ли способ обработки события выбора, измененного на виртуальной машине, который включал бы возможность манипулировать selectedIndex списка? Вот мой код, чтобы вы могли видеть, что я делаю.

                if (value != _selectedAccount)
                {
                    MessageBoxResult mbr = MessageBox.Show("Do you want to save your work?", "Save", MessageBoxButton.YesNoCancel);
                    if (mbr == MessageBoxResult.Yes)
                    {
                        //Code to update corporate
                        Update_Corporate();
                        _preSelectedAccount = value;
                        _selectedAccount = value;
                    }
                    if (mbr == MessageBoxResult.No)
                    {
                        //Do Stuff

                    }
                    if (mbr == MessageBoxResult.Cancel)
                    {

                        SelectedAccount = _preSelectedAccount;
                        NotifyPropertyChanged("SelectedAccount");
                    }

                }

Ответы [ 2 ]

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

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

private Customer selectedCustomer;
public Customer SelectedCustomer
{
    get { return selectedCustomer; }
    set
    {
        if (selectedCustomer== value) return;
        selectedCustomer = value;
        RaisePropertyChanged("SelectedCustomer");
        // Do your stuff here
    }
}

Это пример использования MVVM light (RaisePropertyChanged).

1 голос
/ 13 июля 2011

XAML:

<ListBox ItemsSource="{Binding Customers}" SelectedItem="{Binding SelectedCustomer}" DisplayMemberPath="CustomerName"/>

ViewModel:

private Customer selectedCustomer;
public Customer SelectedCustomer
{
  get
  {
    return selectedCustomer;
  }
  set
  {
    if (value != selectedCustomer)
    {
      var originalValue = selectedCustomer;
      selectedCustomer = value;
      dlgConfirm dlg = new dlgConfirm();
      var result = dlg.ShowDialog();
      if (!result.HasValue && result.Value)
      {
        Application.Current.Dispatcher.BeginInvoke(
            new Action(() =>
            {
                selectedCustomerr = originalValue;
                OnPropertyChanged("SelectedCustomer");
            }),
            System.Windows.Threading.DispatcherPriority.ContextIdle,
            null
        );
      }
      else
        OnPropertyChanged("SelectedCustomer");
    }
  }
}

Взято / дополнительная информация от здесь .

...