C# Prism 6中的无参数视图构造函数

C# Prism 6中的无参数视图构造函数,c#,wpf,mvvm,prism,C#,Wpf,Mvvm,Prism,以下是我想做的(也许还有更好的方法): 我的应用程序旨在跟踪游戏中的玩家。当玩家加入游戏时,将发送事件(使用事件聚合器)以创建用户控件,并将其添加到连接到ItemControl的列表中。当他们离开游戏时,将发送事件以从列表中删除用户控件 实际的ItemContol如下所示-Players绑定到列表,以便它可以显示单个player用户控件: <UserControl> <Grid> <ScrollViewer VerticalScrol

以下是我想做的(也许还有更好的方法): 我的应用程序旨在跟踪游戏中的玩家。当玩家加入游戏时,将发送事件(使用事件聚合器)以创建用户控件,并将其添加到连接到ItemControl的列表中。当他们离开游戏时,将发送事件以从列表中删除用户控件

实际的ItemContol如下所示-Players绑定到列表,以便它可以显示单个player用户控件:

<UserControl>
        <Grid>
        <ScrollViewer VerticalScrollBarVisibility="Auto">
            <ItemsControl ItemsSource="{Binding Players}">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <local:PlayerListView />
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </ScrollViewer>
    </Grid>
</UserControl>
我需要PlayerListViewModel在其构造函数中包含IEventAggregator,但我不确定是否有合适的方法来实现它。我看过这篇关于堆栈溢出的文章:但我不确定这是否是实现我想做的事情的最好方法,我对如何合并它有点困惑

添加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));
        }
    }
}
namespace PlayerTools.ViewModels
{
类PlayerListViewModel
{
#区域专用字段
事件聚合器;
#端区
#地区公共指挥部
ICommand AddPlayerToListCommand{get;set;}
ICommand RemovePlayerFromListCommand{get;set;}
#端区
公共列表玩家=新列表();
#区域构造函数
公共播放列表模型(IEventAggregator事件聚合器)
{
_eventAggregator=eventAggregator;
Players.Add(新的PlayerStackPanelViewModel()
{
PlayerName=“史蒂文”,
PlayerClass=“网球”,
CurrentLevel=10,
死亡人数=0
});
Players.Add(新的PlayerStackPanelViewModel()
{
PlayerName=“史蒂文”,
PlayerClass=“足球”,
CurrentLevel=17,
死亡人数=1
});
//命令
AddPlayerToListCommand=新的DelegateCommand(AddPlayerToList);
RemovePlayerFromListCommand=新的DelegateCommand(RemovePlayerFromList);
}
#端区
public void AddPlayerToList(PlayerStackPanelViewModel播放器)
{
Players.Add(player);
}
public void RemovePlayerFromList(字符串playerName)
{
Players.Remove(Players.Single(s=>s.PlayerName==PlayerName));
}
}
}
您可以使用将视图的
数据上下文连接到视图模型的实例:

PlayerListView.xaml.cs:

public partial class PlayerListView : UserControl
{
    public PlayerListView()
    {
        InitializeComponent();
    }
}
<UserControl ... prism:ViewModelLocator.AutoWireViewModel="True" />
PlayerListView.xaml:

public partial class PlayerListView : UserControl
{
    public PlayerListView()
    {
        InitializeComponent();
    }
}
<UserControl ... prism:ViewModelLocator.AutoWireViewModel="True" />


事件聚合器的使用应该在视图模型中实现,而不是在视图中实现。

能否添加视图模型的代码?玩家名单?,@fhnaseer现在添加到描述的末尾。我尚未订阅/发布任何事件,因为当前无法获取成功生成的代码。如果您需要任何其他课程/代码或解释,请随时告诉我。谢谢。这将使它编译,但显然我有其他问题,因为用户控件没有显示在ItemsControl中。