Как передать объект при переходе к новому виду в PRISM? - PullRequest
4 голосов
/ 17 февраля 2012

Насколько я знаю, в настоящее время PRISM позволяет передавать строки, но не позволяет передавать объекты. Я хотел бы знать, каковы пути преодоления этой проблемы.

Я хочу передать список коллекции. UriQuery в моем случае бесполезен, что мне делать в этом случае?

Ответы [ 4 ]

5 голосов
/ 10 ноября 2015

Призма 5 и 6: теперь класс NavigationParameters можно использовать для передачи параметров объекта во время навигации, используя перегрузки метода RequestNavigate экземпляра Region или RegionManager.

2 голосов
/ 17 февраля 2012

У меня есть своя техника.

Я извлекаю хеш-код объекта и сохраняю его в Dictionary с хэш-кодом в качестве ключа и объектом в качестве значения пары.

Затем я присоединяю хэш-код к UriQuery.

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

Пример кода:

Класс хранилища параметров:

public class Parameters
{
    private static Dictionary<int, object> paramList =
        new Dictionary<int, object>();

    public static void save(int hash, object value)
    {
        if (!paramList.ContainsKey(hash))
            paramList.Add(hash, value);
    }

    public static object request(int hash)
    {
        return ((KeyValuePair<int, object>)paramList.
                    Where(x => x.Key == hash).FirstOrDefault()).Value;
    }
}

Код звонящего:

UriQuery q = null;
Customer customer = new Customer();
q = new UriQuery();
Parameters.save(customer.GetHashCode(), customer);
q.Add("hash", customer.GetHashCode().ToString());

Uri viewUri = new Uri("MyView" + q.ToString(), UriKind.Relative);
regionManager.RequestNavigate(region, viewUri);

Код целевого вида:

public partial class MyView : UserControl, INavigationAware
{
// some hidden code

    public void OnNavigatedTo(NavigationContext navigationContext)
    {
        int hash = int.Parse(navigationContext.Parameters["hash"]);
        Customer cust = (Customer)Parameters.request(hash);
    }
}

Вот и все.

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

Вы можете создать событие PRISM с помощью «объекта» getter / setter. Событие Rise с вашим объектом, приведенным или не приведенным к объекту внутри события (зависит от того, является ли реализация события «общей», как в известных проектах «Инфраструктура»), а затем перейдите к области. В ViewModel, который реализует Region - Subscribe () для указанного выше события, получите его и сохраните локально, а затем просто дождитесь вызова функции OnNavigatedTo. Когда вызывается функция OnNavigatedTo, у вас уже есть объект / класс / структура и вы можете запустить ViewModel.

Например - Класс события:

namespace CardManagment.Infrastructure.Events
{
    using Microsoft.Practices.Prism.Events;

    /// <summary>
    /// Event to pass 'Selected Project' in between pages
    /// </summary>
    public class SelectedProjectViewEvent : CompositePresentationEvent<SelectedProjectViewEvent>
    {
        public object SelectedPorject { get; set; }
    }
}

Класс «Зов»

/// <summary>
/// Called when [back to project view].
/// </summary>
/// <param name="e">The e.</param>
public void OnBackToProjectView(CancelEditProjectEvent e)
{
   eventAggregator.GetEvent<SelectedProjectViewEvent>().Publish(new SelectedProjectViewEvent()
   {
       SelectedPorject = selectedProject
   });

   regionManager.RequestNavigate(WellKnownRegionNames.ProjectViewRegion, new System.Uri("ProjectDetailsView", System.UriKind.Relative));
 }

И это в классе 'Receiver'

    /// <summary>
    /// Called when the implementer has been navigated to.
    /// </summary>
    /// <param name="navigationContext">The navigation context.</param>
    public void OnNavigatedTo(NavigationContext navigationContext)
    {
        if (this.SelectedProject == null)   // <-- If event received untill now
            this.ShouldBeVisible = false;
        else
            this.ShouldBeVisible = true;
     }
0 голосов
/ 24 ноября 2013

Вы также можете проверить, как передавать объекты, если вы используете IOC и хотите использовать инжектор конструктора.

https://stackoverflow.com/a/20170410/1798889

...