【问题标题】:Parameterless View Constructor In Prism 6Prism 6 中的无参数视图构造函数
【发布时间】:2019-03-01 14:19:27
【问题描述】:

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

实际的 ItemContol 看起来像这样 - Players 绑定到 List 以便它可以显示单个玩家用户控件:

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

只需使用以下命令,即可将其插入到主窗口视图的网格行/列中:

<views:PlayerListView />

我遇到的问题是最后一行&lt;views:PlayerListView /&gt;,因为它说“没有可访问的 PlayerListView 构造函数”。这是构造函数背后的代码,我相信我得到这个错误的原因是因为构造函数不是无参数的——这里是代码隐藏。

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

我需要 PlayerListViewModel 在其构造函数中包含 IEventAggregator,但不确定执行此操作的适当方法。我查看了这篇 Stack Overflow 帖子:Prism MVVM - How to pass an IEventAggregator to my 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 现在添加到描述末尾。我没有订阅/发布任何事件,因为我目前无法获得成功构建的代码。如果您需要任何其他类/代码或解释,请随时告诉我。

标签: c# wpf mvvm prism


【解决方案1】:

您可以使用ViewModelLocator 将视图的DataContext 连接到视图模型的实例:

PlayerListView.xaml.cs:

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

PlayerListView.xaml:

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

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

【讨论】:

  • 谢谢。这将使它编译,但显然我还有其他问题,因为用户控件没有显示在 ItemsControl 中。
猜你喜欢
  • 1970-01-01
  • 2015-09-12
  • 2022-01-02
  • 2021-11-24
  • 1970-01-01
  • 1970-01-01
  • 2011-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多