2011-03-16 46 views
1

我需要viewmodel中的view实例来处理ViewModel中的视图元素。我如何将当前View(sender)的实例传递给ViewModel。如何将xaml(view)的当前实例(发送者)传递给ViewModel

<UserControl...> 
    <br>...<br> 
    <Button x:Name="btnRemove" Width="100" Height="30" 
     Content="Remove" Margin="5" Visibility="Hidden" 
     Command="{Binding CellFrame.WidgetRemoveCommand, Mode=OneWay, Source={StaticResource Locator}}" 
     CommandParameter="{Binding Mode=OneWay}" /> 
    <br>...<br> 
</UserControl> 

这将在WidgetRemoveCommand中传递viewModel的实例。如何传递用户控件的权限。

由于

回答

0

在这种情况下,你可以简单地命令属性绑定在用户控件的构造函数。有一个保持指向CellFrame视图模型的定位器类。

btnRemove.Command = some_locator_class.static_method.WidgetRemoveCommand; 
btnRemove.CommandParameter = this; 

的CellFrame视图模型可以有一个名为WidgetRemoveCommand象下面这样RelayCommand:

RelayCommand<CellFrame> WidgetRemoveCommand 

现在,这种继电器命令有委托定义像下面的方法:

public void WidgetRemoveAction(CellFrame cell) 
{ 
    // here you get it! 
} 

所以,诀窍在命令参数中发送'this'。

希望这会有所帮助。

+0

完全绕过MVVM先生的方式。你已经成功地破坏了这个模式。 – Firoso 2011-03-17 17:22:22

0

例如MVVM灯有一个选项来传递EventArgs的与该命令。在EventArgs中有发件人和来自该发件人(父母等),您可以搜索树。

但无论如何不是很好的想法在视图模型中混淆视图。我会将View的代码中的逻辑放在后面,这很好。

+0

同意@Robert:mvvm-ViewModell不应该引用任何视图项 – k3b 2011-03-16 09:43:55

+0

有几种情况可以接受,但仅作为最后的手段,并且仅用于性能场景。 – Firoso 2011-03-16 21:16:56

+0

是的确实viewModel中的视图的直接依赖不是良好的实践。但有一段时间我们需要在视图模型中操纵激烈的GUI。 – 2011-03-17 04:40:57

1

为了解决这个问题,当父视图创建子视图时,让它在创建时在视图模型中注入一个“remove”命令,如下所示。

//Parent 
var model = new ChildControlViewModel(); 
var view = new ChildControl(model); 
Children.Add(view); 
model.RemoveCommand =()=>Children.Remove(view); 

显然,这是大量简化,同时我会确保你有一个视图控件工厂是关系到一个视图模型,甚至在代码中有此背后,似乎......我错了。

另外,您可以使用messenger并注册消息,也可以通过视图模型的操作来接受视图。例如,我使用它在我的一个项目中注册视图 - >查看缩放滑块的交互。这种方法可以用于清除。

public FlickrPhotoBrowserViewModel() 
    { 
     Photos = new ObservableCollection<FlickrPhotoViewModel>(); 
     Messenger.Default.Register<ZoomChangedMessage>(this, message => ImageSize = message.Content); 
    } 

当我创建照片:

public async Task CreatePhotoContainerAsync(string photoID, IImageSearchService searchService, IStreamService streamService) 
    { 
     if (photoID != null) 
     { 
      var Photo = new FlickrPhotoViewModel(photoID); 

      Photo.ShowDetailsCommand = new RelayCommand(() => 
      { 
       FlickrPhotoDataViewer.ShowPhoto(photoID, searchService, streamService); 
      }); 



      // REMOVE CODE!!! ^_^ 
      Photo.RemovePhotoCommand= new RelayCommand(() => 
      { 
       Photos.Remove(Photo); 
       FlickrPhotoDataViewer.CleanupPhotoElement(Photo); 
      }); 
      // REMOVE CODE!!! ^_^ 


      //update async collection from bound UI thread 
      DispatcherHelper.CheckBeginInvokeOnUI(() => Photos.Add(Photo)); 

      var target = await searchService.GetPhotoThumbnailUriAsync(photoID); 

      Photo.ImageStream = await streamService.GetStreamAsync(target); 

      Debug.WriteLine("Image Download Complete " + target); 
     } 
     else 
     { 
      Debug.WriteLine("Image NULL " + photoID); 
     } 
    } 
相关问题