Основная суть MVVM - ViewModel ничего не знает об интерфейсе(View). View же о ViewModel знает. Поэтому создавать конкретную View в обработчике комманды конечно неправильно.
Но view можно связать с ViewModel в xaml коде, который уже является частью интерфейса, примерно так:
<DataTemplate DataType="{x:Type vm:TrollViewModel}">
<v:TrollView />
</DataTemplate>
А в обработчике комманды лишь создавать ViewModel. Примерно так:
protected void ShowWorkspace<T>() where T : WorkspaceViewModel, new()
{
WorkspaceViewModel workspace = this.Workspaces.FirstOrDefault(vm => vm is T) as T;
if (workspace == null)
{
workspace = new T();
this.Workspaces.Add(workspace);
}
this.SetActiveWorkspace(workspace);
}
protected void SetActiveWorkspace(WorkspaceViewModel workspace)
{
Debug.Assert(this.Workspaces.Contains(workspace));
ICollectionView collectionView = CollectionViewSource.GetDefaultView(this.Workspaces);
if (collectionView != null)
collectionView.MoveCurrentTo(workspace);
}
Подробнее об этом решении в статье
автора
Строчку же можно передать в виде обьекта. ListView у тебя забинжена к какой-то коллекции Collection. Этот самый SomeObject передать в качестве параметра во ViewModel. Главное что-бы он наследовал интерфейс INotifyPropertyChanged.