Вот что я пытаюсь сделать (и может быть лучший способ): Мое приложение предназначено для отслеживания игроков в игре. Когда игроки присоединяются к игре, события будут отправляться (с помощью агрегатора событий) для создания пользовательского элемента управления и добавления его в список, который подключен к элементу управления. Когда они покинут игру, будут отправлены события для удаления пользовательского элемента управления из списка.
Фактический ItemContol выглядит так: привязка Players к списку, чтобы он мог отображать пользовательские элементы управления отдельных игроков:
<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));
}
}
}
@fhnaseer Добавлено в конец описания. Я не подписался/не публиковал какие-либо события, так как не могу получить код для успешной сборки в настоящее время. Если вам нужны какие-либо другие классы/код или пояснения, пожалуйста, дайте мне знать.





Вы можете использовать ViewModelLocator для подключения DataContext представления к экземпляру вашей модели представления:
PlayerListView.xaml.cs:
public partial class PlayerListView : UserControl
{
public PlayerListView()
{
InitializeComponent();
}
}
PlayerListView.xaml:
<UserControl ... prism:ViewModelLocator.AutoWireViewModel = "True" />
Использование вами агрегатора событий должно быть реализовано в модели представления, а не в представлении.
благодаря. Это заставит его скомпилироваться, но, видимо, у меня есть другие проблемы, поскольку пользовательские элементы управления не отображаются в ItemsControl.
Можете ли вы добавить код вашей модели просмотра? Список игроков?,