C# 从ViewModel执行UserControl只读ICommand

C# 从ViewModel执行UserControl只读ICommand,c#,wpf,mvvm,user-controls,C#,Wpf,Mvvm,User Controls,我有一个专门的UserControl来播放名为PlayerView的媒体内容。 控件有自己的命令(只读,不由客户端提供) 控件的play命令在XAML中正常工作: <Controls:PlayerView x:Name="PlayerView" /> <Button Command="{Binding ElementName=PlayerView, Path=PlayCommand, Mode=OneWay}" Content="Play" /> 问题是:Slides

我有一个专门的
UserControl
来播放名为
PlayerView
的媒体内容。 控件有自己的命令(只读,不由客户端提供)

控件的play命令在XAML中正常工作:

<Controls:PlayerView x:Name="PlayerView" />
<Button Command="{Binding ElementName=PlayerView, Path=PlayCommand, Mode=OneWay}" Content="Play" />


问题是:SlideshowViewModel如何执行该控件的play命令?是否有最佳实践?

如果我正确理解了您的问题,ViewModel应该包含命令的实现,而不是视图。这将是一个更真实的MVVM实现,然后VM可以在必要时从自身内部调用该命令

编辑:

回答你的问题,

public partial class PlayerView : IHaveAPlayCommand
{
public PlayerView()
{
      this.DataContext = new ViewModel(this);
}
}


public class ViewModel
{
      IHaveAPlayCommand view;
      public ViewModel(IHaveAPlayCommand view)
      {
           this.view = view
      }

}

非常感谢。我已经考虑过这个选择。但是控件是专门的,客户机不需要知道关于它的实现的任何信息。因此,我希望在控件内实现play命令。我认为这当然值得讨论,但我相信每个视图都应该有自己的viewmodel。风景就是你所看到的;逻辑是在VM中实现的。但是,为了回答您的问题,当您将datacontext设置为viewmodel时,您可以将视图实例传递给该viewmodel,并让每个视图实现一个包含“播放”命令的界面。然后,您将从VM中获得对视图的引用。非常感谢您的帮助!我有
SlideshowViewModel
,控件不知道它,因为它是一个“外部”视图模型。你能看看ViewModels(问题已经更新了)吗?这看起来像是一个非常规的实现,但是如果你是这样设置的,那么只需将控件的实例传递到mainViewModel,然后从那里传递到SlideshowViewModel。你确定Slideshowviewmodel不应该从MAinViewModel派生吗?“有最佳实践吗?”最佳实践是在你的ViewModel中包含此逻辑当然,我知道。但是我想简化
PlayerControl
:控件的客户端不应该知道控件实际如何播放音频/视频,甚至不应该为其构建特殊的ViewModel。因此,您应该有一个带有虚拟“OnPlayClicked”方法的通用ViewModel,并且每个视图都应该有一个实现该ViewModel的VM但覆盖了OnPlayCLicked方法。这将是最佳实践,而且仍然很简单。看看这个和这个
SlideshowViewModel
PlayerView
如何相互引用?其中一方“知道”另一方吗?
public class SlideshowViewModel : ViewModelBase
{
    // Stores collection of audio/video clips to be played by the PlayerView.

    // Assume that this ViewModel should invoke PlayerView PlayCommand.
}

public class MainViewModel : ViewModelBase
{
    // Stores a lot of stuff.

    public SlideshowViewModel Slideshow { get; }
}
public partial class PlayerView : IHaveAPlayCommand
{
public PlayerView()
{
      this.DataContext = new ViewModel(this);
}
}


public class ViewModel
{
      IHaveAPlayCommand view;
      public ViewModel(IHaveAPlayCommand view)
      {
           this.view = view
      }

}