Получить выбранный элемент из списка с помощью MVVM - PullRequest
2 голосов
/ 23 февраля 2012

Я использую MVVM в этом проекте, у меня есть список, который привязывается к коллекции клиентов. Я хочу создать событие для навигации по detailsPage, используя идентификатор выбранного элемента:

 <ListBox ItemsSource="{Binding Customers}" x:Name="state_list" SelectionChanged="state_list_SelectionChanged">
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="selectionchanged">
                    <cmd:EventToCommand Command="{Binding stateSelectedCommand}" PassEventArgsToCommand="True"  />

                 </i:EventTrigger>
            </i:Interaction.Triggers>
                <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Vertical">
                        <TextBlock Text="{Binding nom}" />
                        <!--TextBlock Text="{Binding LastName}" />
                        <TextBlock Text="{Binding Text, ElementName=tbCount}" /-->
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

Я не могу понять, как заставить выбранный элемент добавить его в URI, а затем использовать его для получения данных. Пример или учебное пособие было бы полезно. Спасибо:)

Ответы [ 2 ]

6 голосов
/ 23 февраля 2012

Я бы создал свойство SelectedCustomer в ViewModel (рядом со свойством Customers) и связал его с SelectedItem.Затем в настройке этого свойства вы можете перейти на нужную страницу.Таким образом вы устраняете беспорядочные события и команды.

<ListBox x:Name="state_list 
         ItemsSource="{Binding Customers}" 
         SelectedItem="{Binding SelectedCustomer, Mode=TwoWay}">

...

public Customer SelectedCustomer
{
  get
  {
    return _selectedCustomer;
  }
  set
  {
    if (value != null)
    {
    _selectedCustomer = value;
    //Navigate to your page here, either with Navigator class or any other mechanism you have in place for changing content on screen
    }
  } 

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

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

Я расскажу об этом в своем блоге, который я сделал некоторое время назад, но краткий итог этого в MVVMLight - создание класса Navigator, который находится на уровне приложения.

public class Navigator
    {

        private PhoneApplicatoinFrame RootFrame;

        public Navigator(PhoneApplicationFrame frame)
        {
            RootFrame = frame;
            RegisterMessages();
        }

        private void RegisterMessages()
        {
            Messenger.Default.Register<ShowTrackerMessage>(this, ShowTracker);
        }

        private void ShowTracker(ShowTrackerMessage msg)
        {
            RootFrame.Navigate(new Uri("/Views/ItemLocationCompassView.xaml", UriKind.RelativeOrAbsolute));
        }

}

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

    private static Navigator _navigator;
    public static Navigator Nav
    {
        get { return _navigator; }
    }

...

_navigator = new Navigator(this.RootFrame);

Затем у вас есть несколько вариантов отправки сообщения навигации.

Вариант 1. В вашей ViewModel подключитесь к событию PropertyChanged (часть INotifyPropertyChanged) и отправьте соответствующее сообщение при изменении свойства SelectedItem.

Вариант 2: привязать к событию SelectionChanged вашего ListBox. Я использую EventToCommand MVVMLight, чтобы отправить это событие RelayCommand в моей ViewModel, а затем реагирую соответствующим образом, чтобы отправить сообщение объекту Navigator.

Я расскажу об этом подробнее: http://www.smartchitecture.com/?p=27

...