Prism 6 中的无参数视图构造函数
Parameterless View Constructor In Prism 6
这是我正在尝试做的事情(可能还有更好的方法):
我的应用程序旨在跟踪游戏中的玩家。当玩家加入游戏时,将发送事件(使用事件聚合器)以创建用户控件并将其添加到连接到 ItemControl 的列表中。当他们离开游戏时,将发送事件以从列表中删除用户控件。
实际的 ItemContol 看起来像这样 - Players 绑定到列表,以便它可以显示单个玩家用户控件:
<UserControl>
<Grid>
<ScrollViewer VerticalScrollBarVisibility="Auto">
<ItemsControl ItemsSource="{Binding Players}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<local:PlayerListView />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
</Grid>
</UserControl>
只需使用以下命令即可将其插入到主 window 视图的网格 row/column 中:
<views:PlayerListView />
我 运行 遇到的问题是最后一行 <views:PlayerListView />
因为它说的是 "There are no accessible PlayerListView constructors"。这是构造函数背后的代码,我相信我收到此错误的原因是因为构造函数不是无参数的——这是代码隐藏。
public partial class PlayerListView : UserControl
{
public PlayerListView(IEventAggregator eventAggregator)
{
InitializeComponent();
DataContext = new PlayerListViewModel(eventAggregator);
}
}
我需要 PlayerListViewModel 在其构造函数中包含 IEventAggregator,但不确定正确的方法。我看过这个 Stack Overflow post: 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));
}
}
}
您可以使用 ViewModelLocator 将视图的 DataContext
连接到视图模型的实例:
PlayerListView.xaml.cs:
public partial class PlayerListView : UserControl
{
public PlayerListView()
{
InitializeComponent();
}
}
PlayerListView.xaml:
<UserControl ... prism:ViewModelLocator.AutoWireViewModel="True" />
您对事件聚合器的使用应该在视图模型而不是视图中实现。
这是我正在尝试做的事情(可能还有更好的方法): 我的应用程序旨在跟踪游戏中的玩家。当玩家加入游戏时,将发送事件(使用事件聚合器)以创建用户控件并将其添加到连接到 ItemControl 的列表中。当他们离开游戏时,将发送事件以从列表中删除用户控件。
实际的 ItemContol 看起来像这样 - Players 绑定到列表,以便它可以显示单个玩家用户控件:
<UserControl>
<Grid>
<ScrollViewer VerticalScrollBarVisibility="Auto">
<ItemsControl ItemsSource="{Binding Players}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<local:PlayerListView />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
</Grid>
</UserControl>
只需使用以下命令即可将其插入到主 window 视图的网格 row/column 中:
<views:PlayerListView />
我 运行 遇到的问题是最后一行 <views:PlayerListView />
因为它说的是 "There are no accessible PlayerListView constructors"。这是构造函数背后的代码,我相信我收到此错误的原因是因为构造函数不是无参数的——这是代码隐藏。
public partial class PlayerListView : UserControl
{
public PlayerListView(IEventAggregator eventAggregator)
{
InitializeComponent();
DataContext = new PlayerListViewModel(eventAggregator);
}
}
我需要 PlayerListViewModel 在其构造函数中包含 IEventAggregator,但不确定正确的方法。我看过这个 Stack Overflow post: 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));
}
}
}
您可以使用 ViewModelLocator 将视图的 DataContext
连接到视图模型的实例:
PlayerListView.xaml.cs:
public partial class PlayerListView : UserControl
{
public PlayerListView()
{
InitializeComponent();
}
}
PlayerListView.xaml:
<UserControl ... prism:ViewModelLocator.AutoWireViewModel="True" />
您对事件聚合器的使用应该在视图模型而不是视图中实现。