Вот что я пытаюсь сделать (и, может быть, есть лучший способ): мое приложение предназначено для отслеживания игроков в игре.Когда игроки присоединяются к игре, события будут отправляться (с помощью агрегатора событий) для создания пользовательского элемента управления и добавления его в список, связанный с 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));
}
}
}