Конструктор представления без параметров в Prism 6 - PullRequest
0 голосов
/ 01 марта 2019

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

Фактический ItemContol выглядит следующим образом: привязка игроков к списку позволяет отображать элементы управления отдельных игроков:

<UserControl>
        <Grid>
        <ScrollViewer VerticalScrollBarVisibility="Auto">
            <ItemsControl ItemsSource="{Binding Players}">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <local:PlayerListView />
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </ScrollViewer>
    </Grid>
</UserControl>

Вставляется в строку / столбец сеткив главном окне просто с помощью приведенной ниже команды:

<views:PlayerListView />

Проблема, с которой я сталкиваюсь, - это последняя строка <views:PlayerListView />, которая говорит: «Нет доступных конструкторов PlayerListView».Вот код с конструктором, и я полагаю, что причина, по которой я получаю эту ошибку, заключается в том, что конструктор не без параметров - вот код-позади.

public partial class PlayerListView : UserControl
{
    public PlayerListView(IEventAggregator eventAggregator)
    {
        InitializeComponent();
        DataContext = new PlayerListViewModel(eventAggregator);
    }
}

Мне нужно, чтобы PlayerListViewModel имел IEventAggregator в своем конструкторе, но я не уверен, что это можно сделать соответствующим образом.Я просмотрел этот пост переполнения стека: Prism MVVM - Как передать IEventAggregator в мою ViewModel , но я не уверен, является ли это лучшим способом для достижения того, что я пытаюсь сделать, или нет, и я немного запуталсяо том, как бы я включил его.

Добавление PlayerListViewModel

namespace PlayerTools.ViewModels
{
    class PlayerListViewModel
    {
        #region Private Fields
        IEventAggregator _eventAggregator;
        #endregion

        #region Public Commands
        ICommand AddPlayerToListCommand { get; set; }
        ICommand RemovePlayerFromListCommand { get; set; }
        #endregion

        public List<PlayerStackPanelViewModel> Players = new List<PlayerStackPanelViewModel>();

        #region Constructor
        public PlayerListViewModel(IEventAggregator eventAggregator)
        {
            _eventAggregator = eventAggregator;

            Players.Add(new PlayerStackPanelViewModel()
            {
                PlayerName = "Steven",
                PlayerClass = "Tennis",
                CurrentLevel = 10,
                NumberOfDeaths = 0
            });
            Players.Add( new PlayerStackPanelViewModel()
            {
                PlayerName = "Steven",
                PlayerClass = "Soccer",
                CurrentLevel = 17,
                NumberOfDeaths = 1
            });

            //Commands
            AddPlayerToListCommand = new DelegateCommand<PlayerStackPanelViewModel>(AddPlayerToList);
            RemovePlayerFromListCommand = new DelegateCommand<string>(RemovePlayerFromList);
        }
        #endregion

        public void AddPlayerToList(PlayerStackPanelViewModel player)
        {
            Players.Add(player);
        }

        public void RemovePlayerFromList(string playerName)
        {
            Players.Remove(Players.Single(s => s.PlayerName == playerName));
        }
    }
}

1 Ответ

0 голосов
/ 01 марта 2019

Вы можете использовать ViewModelLocator , чтобы связать DataContext представления с экземпляром вашей модели представления:

PlayerListView.xaml.cs:

public partial class PlayerListView : UserControl
{
    public PlayerListView()
    {
        InitializeComponent();
    }
}

PlayerListView.xaml:

<UserControl ... prism:ViewModelLocator.AutoWireViewModel="True" />

Использование агрегатора событий должно быть реализовано в модели представления, а не в представлении.

...