Переход между видом и моделью вида - PullRequest
4 голосов
/ 06 сентября 2011

Есть ли способ заставить Resharper или «просто» Visual Studio (возможно, с помощью макроса) переходить между представлением и моделью представления в шаблоне MVVM.

Как Resharper может переходить между xaml иэто код, использующий F7 и Shift-F7

Я придерживаюсь соглашения, что файлы расположены следующим образом:

\ Views \ name \ AbcView.xaml
\ ViewModels \ name \ AbcViewModel.xaml

Ответы [ 3 ]

2 голосов
/ 06 сентября 2011

Возможно, мне следовало сначала поискать в Google, здесь - это макрос, который делает то же самое для .cpp и. .h файлы

Я немного изменил его и назначил макрос Ctrl + F7. Кажется, работает нормально

Public Sub SwitchBetweenViewAndViewModel()
    '=====================================================================  
    ' If the currently open document is a view or viewmodel, attempts to  
    ' switch between them
    '=====================================================================  
    Dim currentDocument As String
    Dim targetDocument As String

    currentDocument = ActiveDocument.FullName

    If currentDocument.ToLower().Contains("\views\") And _
       (currentDocument.EndsWith("View.xaml", StringComparison.InvariantCultureIgnoreCase) Or _
        currentDocument.EndsWith("View.xaml.cs", StringComparison.InvariantCultureIgnoreCase)) Then
        targetDocument = currentDocument
        targetDocument = targetDocument.Replace(".xaml.cs", "")
        targetDocument = targetDocument.Replace(".xaml", "")
        targetDocument = targetDocument.Replace("\Views\", "\ViewModels\")
        targetDocument = targetDocument + "Model.cs"
    ElseIf currentDocument.ToLower().Contains("\viewmodels\") And currentDocument.EndsWith(".cs", StringComparison.InvariantCultureIgnoreCase) Then
        targetDocument = currentDocument
        targetDocument = targetDocument.Replace("\ViewModels\", "\Views\")
        targetDocument = targetDocument.Replace("ViewModel.cs", "View.xaml")
    End If

    If System.IO.File.Exists(targetDocument) Then
        OpenDocument(targetDocument)
    End If
End Sub

'=====================================================================  
' Given a document name, attempts to activate it if it is already open,  
' otherwise attempts to open it.  
'=====================================================================  
Private Sub OpenDocument(ByRef documentName As String)
    Dim document As EnvDTE.Document
    Dim activatedTarget As Boolean
    activatedTarget = False

    For Each document In Application.Documents
        If document.FullName = documentName And document.Windows.Count > 0 Then
            document.Activate()
            activatedTarget = True
            Exit For
        End If
    Next
    If Not activatedTarget Then
        Application.Documents.Open(documentName, "Text")
    End If
End Sub
1 голос
/ 29 февраля 2012

Используя ответ @Karstens, я изменил сабвуфер, который переключается между файлами, чтобы оба могли переключаться между .cpp и .h файлами , а также Просмотр и просмотр файлов моделей .

Если вы хотите сделать то же самое, следуйте инструкциям в его ссылке , но используйте вместо этого этот саб:

'=====================================================================  
' If the currently open document is a CPP or an H file, attempts to  
' switch between the CPP and the H file.  
'
' If the currently open document is a View.xml or an ViewModel.cs file, attempts to  
' switch between the View and the ViewModel file.  
'=====================================================================  
Sub SwitchBetweenAssociatedFiles()
    Dim currentDocument As String
    Dim targetDocument As String

    currentDocument = ActiveDocument.FullName

    If currentDocument.EndsWith(".cpp", StringComparison.InvariantCultureIgnoreCase) Then
        targetDocument = Left(currentDocument, Len(currentDocument) - 3) + "h"
    ElseIf currentDocument.EndsWith(".h", StringComparison.InvariantCultureIgnoreCase) Then
        targetDocument = Left(currentDocument, Len(currentDocument) - 1) + "cpp"
    ElseIf currentDocument.EndsWith("View.xaml", StringComparison.InvariantCultureIgnoreCase) Then
        targetDocument = currentDocument.Replace("\Views\", "\ViewModels\")
        targetDocument = targetDocument.Replace("\View\", "\ViewModel\")
        targetDocument = targetDocument.Replace("View.xaml", "ViewModel.cs")
    ElseIf currentDocument.EndsWith("ViewModel.cs", StringComparison.InvariantCultureIgnoreCase) Then
        targetDocument = currentDocument.Replace("\ViewModels\", "\Views\")
        targetDocument = targetDocument.Replace("\ViewModel\", "\View\")
        targetDocument = targetDocument.Replace("ViewModel.cs", "View.xaml")
    End If

    If System.IO.File.Exists(targetDocument) Then
        OpenDocument(targetDocument)
    End If

End Sub

Я назначил его на Alt + § , который был свободен в моей конфигурации.Удобно рядом с Alt + Tab .^ _ ^

1 голос
/ 06 сентября 2011

Что, если более одного ViewModels выделены для одного и того же View?:)

U может просто использовать расширение разметки DesignInstance, чтобы навигация R # и завершение кода в привязке работали хорошо:

namespace WpfApplication1.ViewModels
{
  public class PersonViewModel
  {
    public string Name { get; set; }
    public int Age     { get; set; }
  }
}

И соответствующее представление:

<Window x:Class="WpfApplication1.Views.PersonView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="PersonInfo" Height="300" Width="300"

        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        mc:Ignorable="d"

        xmlns:vms="clr-namespace:WpfApplication1.ViewModels"

        d:DataContext="{d:DesignInstance Type=vms:PersonViewModel}">

  <UniformGrid>
    <TextBlock Grid.Row="0" Grid.Column="0" Text="Name" />
    <TextBlock Grid.Row="0" Grid.Column="1" Text="Age" />
    <TextBlock Grid.Row="1" Grid.Column="0" Text="{Binding Name}" />
    <TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding Age}" />
  </UniformGrid>

</Window>

Теперь R # может проверять все ссылки на ViewModel свойств в привязках, поможет вам заполнить имена свойств, а также может перейти непосредственно к этим свойствам.Более того, весь приведенный выше код быстро запекается с использованием R # Укажите тип DataContext в ... quick fix (при неразрешенных выражениях привязки).

ps View stillне зависят от ViewModel , поскольку все атрибуты времени разработки будут удалены после компиляции (атрибутом mc:Ignorable="d").

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...