[英]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.