Prism2/MVVM Близко Просматривают от ViewModel

Да. Однако необходимо создать функцию SQL-сервера сначала и вызов, что, поскольку по умолчанию LINQ будет использовать подобное.

Этот сообщение в блоге , который объяснит деталь, но это - извлечение:

Для получения это работающий Вас должно создать табличную функцию, которая делает не что иное как запрос CONTAINSTABLE на основе ключевых слов, в которых Вы передаете,

create function udf_sessionSearch
      (@keywords nvarchar(4000))
returns table
as
  return (select [SessionId],[rank]
            from containstable(Session,(description,title),@keywords))

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

    var sessList = from s   in DB.Sessions
                   join fts in DB.udf_sessionSearch(SearchText) 
                   on s.sessionId equals fts.SessionId
                 select s;

5
задан Anderson Imes 13 September 2009 в 17:48
поделиться

3 ответа

Это действительно зависит от архитектуры вашего приложения, но вот как я это делаю с помощью Prism.

Во-первых, я хочу сказать, нормально иметь ссылку на вашу виртуальную машину Представление, пока оно не является конкретной реализацией Представления, то есть ссылками по интерфейсу.

Я объединяю Представление и Модель Представления, используя внедрение зависимостей, очень похоже на то, как это делается в StockTraderRI. Итак, у меня есть IView и IViewModel. IViewModel имеет свойство под названием "View" типа IView.

На уровне кода (для меня обычно контроллер ... см. StockTraderRI), который работает с вашими регионами, добавьте механизм для удаления вашего представления из региона.

12147] Например:

myRegion.Remove(myIViewModel.View);

Если регионы обрабатываются контроллером, вы можете захотеть поместить простое событие в виртуальную машину, чтобы уведомлять, когда виртуальная машина хочет быть «закрытой». Вы также можете поэкспериментировать с IEventAggregator, если хотите использовать слабую модель обработки событий. Если регион обрабатывается в виртуальной машине, просто добавьте туда этот код.

5
ответ дан 18 December 2019 в 11:58
поделиться

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

Джош Смит написал статью , показывающую как это сделать (примерно в середине статьи).

7
ответ дан 18 December 2019 в 11:58
поделиться

Вот как выглядит мой модуль входа в систему:

    public class LoginModule : IModule
{
    private readonly IUnityContainer container;

    public LoginModule(IUnityContainer container)
    {
        this.container = container;
    }

    #region IModule Members

    public void Initialize()
    {
        this.container.RegisterType<ILoginController, LoginController>(new ContainerControlledLifetimeManager());
        this.container.RegisterType<ILoginView, LoginView>();
        this.container.RegisterType<ILoginViewModel, LoginViewModel>();

        ILoginController controller = this.container.Resolve<ILoginController>();
        controller.Run();
    }

    #endregion
}

Это контроллер:

    public class LoginController : ILoginController
{
    private readonly IRegionManager regionManager;
    private readonly ILoginViewModel model;

    public LoginController(IRegionManager regionManager, ILoginViewModel model)
    {
        this.regionManager = regionManager;
        this.model = model;
        model.RequestClose += new EventHandler(model_RequestClose);
    }

    void model_RequestClose(object sender, EventArgs e)
    {
        regionManager.Regions["LoginRegion"].Remove(model.View);
    }

    #region ILoginController Members

    public void Run()
    {
        // Register views here
        regionManager.Regions["LoginRegion"].Add(model.view);
    }

    #endregion
}

А это моя ViewModel:

    public class LoginViewModel : ViewModelBase, ILoginViewModel
{
    IEventAggregator _eventAggregator;
    RelayCommand _loginCommand;
    private readonly UserProfileRepository _userProfileRepository;
    public event EventHandler RequestClose;

    public ICommand LoginCommand
    {
        get
        {
            if (_loginCommand == null)
            {
                _loginCommand = new RelayCommand(
                    param => this.Login(),
                    param => this.IsValid());
            }
            return _loginCommand;
        }
    }

    public LoginViewModel(IEventAggregator eventAggregator, UserProfileRepository userProfileRepository, ILoginView view)
    {
        this._eventAggregator = eventAggregator;
        this._userProfileRepository = userProfileRepository;
        this.View = view;
    }

    #region ILoginViewModel Members

    public ILoginView View { get; private set; }

    #endregion
}
3
ответ дан 18 December 2019 в 11:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: