Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Silverlight 我应该将ICommand的逻辑放在哪里?_Silverlight_Mvvm - Fatal编程技术网

Silverlight 我应该将ICommand的逻辑放在哪里?

Silverlight 我应该将ICommand的逻辑放在哪里?,silverlight,mvvm,Silverlight,Mvvm,我最近开始在silverlight中使用MVVM模式,我不确定是否正确使用了它 桂 我目前有一个MainView,它包含股票市场板块的组合框。当用户选择一个部门(如能源)并单击添加按钮时,该部门的股票列表将显示在列表框中。在列表框中每个股票的旁边都有一个删除按钮,可用于从列表框中删除单个股票 我已经实现了以下ViewModels。下面只是代码的说明 公共类主视图模型 { 公共部门视图模型当前部门 { 收到 设置 } 公共字符串选择扇区 { 收到 设置 } public void addsecto

我最近开始在silverlight中使用MVVM模式,我不确定是否正确使用了它

我目前有一个MainView,它包含股票市场板块的组合框。当用户选择一个部门(如能源)并单击添加按钮时,该部门的股票列表将显示在列表框中。在列表框中每个股票的旁边都有一个删除按钮,可用于从列表框中删除单个股票

我已经实现了以下ViewModels。下面只是代码的说明

公共类主视图模型 { 公共部门视图模型当前部门 { 收到 设置 } 公共字符串选择扇区 { 收到 设置 } public void addsectorclicked命令 { CurrentSector=新Sector视图模型Selected Sector; } } 公共类SectorViewModel { 公共可观测集合存量=新可观测集合; 公共扇区ViewModelString扇区 { List stocklist=StockProvider.GetStockssector; 对于库存列表中的每个var s { StockViewModel svm=新的StockViewModels; Remove+={//Remove svm from Stocks collection logic Stocks.addsvm; } } } 我的问题是:在whcih viewmodel中,最好为列表框中每一行的Remove按钮添加代码实现??Remove按钮应该将StockViewModel从SectorViewModel.Stocks集合中删除

我目前已将RemoveClicked方法添加到StockViewModel中,如上图所示。此代码将向SectorViewModel激发一个事件,SectorViewModel的RemoveStock方法将StockViewModel从Stock集合中移除


是否有更好的方法来实现此删除功能?我是MVVM新手,不确定这是否是开发此功能的最佳方法,因为SectorViewModel需要注册到StockViewModel的事件。

就个人而言,我不喜欢事件,因为你应该取消订阅它们,而且它们可以在不需要的地方使用这不合适

我将使用构造函数参数来处理remove命令,如下所示:

公共类StockViewModel { public stock view model stock stock,Action remove命令 { //... this.RemoveCommand=newdelegateCommand=>removeCommandActionthis; } } 公共类SectorViewModel { 公共部门视图模型 { //... StockViewModel svm=新的StockViewModels,this.RemoveStock; Stocks.addsvm; } 私有void RemoveStockViewModel股票 { //... } } 另一种方法是使用某种类型的EventAggregator模式,例如,MVVM light Toolkit中的Messenger类。但我认为,对于这样简单的任务来说,这是一种过分的做法:

public StockViewModelStock股票,IMessenger messenger { //... this.RemoveCommand=newdelegateCommand=> Sendnew NotificationMessagethis,removietemnotification; } 公共部门视图模型IMessenger messenger { //... messenger.Registerthis,msg=> { 如果msg.Notification==StockViewModel.RemoveItemNotification { this.removestockmg.Content; } } } 我还听说Silverlight 5支持绑定到相对源。 还有第三种方法。我不确定这个例子是否有效,但至少应该:

<Button Content="Remove" 
    Command="{Binding DataContext.RemoveCommand RelativeSource={RelativeSource AncestorType=ListBox}}"
    CommandParameter="{Binding}" />

顺便说一句,最后一个示例是最受欢迎的,并且在WPF应用程序中使用,因为WPF始终具有相对的资源绑定。

就个人而言,我不喜欢事件,因为您应该取消订阅它们,而且它们也可以在不合适的地方使用

我将使用构造函数参数来处理remove命令,如下所示:

公共类StockViewModel { public stock view model stock stock,Action remove命令 { //... this.RemoveCommand=newdelegateCommand=>removeCommandActionthis; } } 公共类SectorViewModel { 公共部门视图模型 { //... StockViewModel svm=新的StockViewModels,this.RemoveStock; Stocks.addsvm; } 私有void RemoveStockViewModel股票 { //... } } 另一种方法是使用某种类型的EventAggregator模式,例如,MVVM light Toolkit中的Messenger类。但我认为,对于这样简单的任务来说,这是一种过分的做法:

public StockViewModelStock股票,IMessenger messenger { //... this.RemoveCommand=newdelegateCommand=> Sendnew NotificationMessagethis,removietemnotification; } 公共部门视图模型IMessenger messenger { //... messenger.Registerthis,msg=> { 如果msg.Notification==StockViewModel.RemoveItemNotification { this.removestockmg.Content; } } } 我还听说Silverlight 5支持绑定到相对源。 第三个问题 方法我不确定这个例子是否有效,但至少应该:

<Button Content="Remove" 
    Command="{Binding DataContext.RemoveCommand RelativeSource={RelativeSource AncestorType=ListBox}}"
    CommandParameter="{Binding}" />

顺便说一句,最后一个示例是最受欢迎的,并且在WPF应用程序中使用,因为WPF始终具有相对的资源绑定。

我的设计似乎还不错,因为这也是这里所做的,我的设计似乎还不错,因为这也是这里所做的