簡體   English   中英

Prism 6中的無參數視圖構造函數

[英]Parameterless View Constructor In Prism 6

這是我正在嘗試做的事情(可能會有更好的方法):我的應用程序旨在跟蹤游戲中的玩家。 當玩家加入游戲時,將發送事件(使用事件匯總器)以創建用戶控件,並將其添加到連接到ItemControl的列表中。 當他們離開游戲時,將發送事件以從列表中刪除用戶控件。

實際的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 />

我遇到的問題是最后一行<views:PlayerListView />因為它說“沒有可訪問的PlayerListView構造函數”。 這是構造函數后面的代碼,我相信我收到此錯誤的原因是因為構造函數不是無參數的-這是背后的代碼。

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

我需要PlayerListViewModel在其構造函數中具有IEventAggregator,但不確定執行此操作的適當方法。 我看過這個Stack Overflow帖子: 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));
        }
    }
}

您可以使用ViewModelLocator將視圖的DataContext到視圖模型的實例:

PlayerListView.xaml.cs:

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

PlayerListView.xaml:

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

您對事件聚合器的使用應在視圖模型中而非視圖中實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM