1

動機: Visual Studio と同じように動作する
[ファイル] -> [名前を付けて保存] が必要です。MenuItem何も開いていない場合、「選択した項目を名前を付けて保存...」と表示され、特定のファイル (例: SomeFile.cs) をタブで開くと、 「名前を付けてMenuItem保存SomeFile.cs...」と表示されます。


マイ アプリ アーキテクチャ ( MVVM、 を使用MVVM Light):

MainWindow.xaml:

<MenuItem Header="{Binding SelectedProjectName}" HeaderStringFormat="Save {0} As..." />

MainWindowViewModel:

開いているタブ (開いているファイル) のコレクションを保持します

private ObservableCollection<BaseProjectViewModel> _projects;

現在選択されているタブを返すプロパティがあります

public BaseProjectViewModel SelectedProject
{
    get
    {
        return _selectedProject;
    }
    set
    {
        if (_selectedProject == value)
        {
            return;
        }
        _selectedProject = value;
        RaisePropertyChanged("SelectedProject");
        RaisePropertyChanged("SelectedProjectName");
    }
}

現在選択されているタブのファイル名を返すプロパティを作成しました

public string SelectedProjectName
{
    get
    {
        if (SelectedProject == null)
        {
            return "Selected Item";
        }
        return SelectedProject.SafeFileName;
    }
}

BaseProjectViewModelさまざまなファイル タイプの基本クラスとして機能します。各ファイル タイプには、 から派生した独自のクラスがありますBaseProjectViewModelPaneHeaderたとえば、ペインヘッダーに表示される文字列を返す SafeFileName、パスのファイル名だけを返すなどのプロパティが あります...

質問:
ファイルの名前を変更した場合 (したがって のプロパティを変更した場合)、 で をトリガーするにはBaseProjectViewModelどうすればよいですか? それを行う最もクリーンな方法は何ですか?RaisePropertyChangedSelectedProjectNameMainWindowViewModel

私の考え
それを行うための2つの可能な方法を考えましたが、それらのいずれかがそれを行う正しい方法であるかどうかはわかりません:

  1. (要するに) を聞いてCollectionChanged_projectsます。add/remove -> subscribe/ubsubscribe がある場合、PropertyName が探しているものであるかどうかを調べるイベント ハンドラーがあり、そうである場合は引き続きRaisePropertyChanged("SelectedProjectName")?を呼び出します。

  2. のようなものを使用しますMVVM Light Messaging

質問 2:他の方法を提案せず、実際にこれら 2 つのうちの 1 つを提案する場合、長所と短所について詳しく教えてください。


編集

問題を示すために非常に単純なプロジェクトを作成しました - LINK。プロジェクトを実行すると:

  • 'New' は、新しい TabItem を追加します。テキストが編集されると、TabHeader はアスタリスクで装飾されます。
  • 「保存 {0}」メニュー項目は、選択された TabItem を「保存」します (アスタリスクを削除することによってシミュレートされます)。例を複雑にしたり、SaveFileDialog などを導入したりしたくありませんでした。
  • 「名前を付けて保存 {0}」メニュー項目は、名前を付けて保存をシミュレートし、タブ ヘッダー文字列の末尾に「X」文字を追加します。

TabItem が選択されていない場合、{0} は「選択された項目」に解決されます。

1 つのタブを選択した状態で SaveAs() をクリックしてメニューを開くと、SelectedProjectName プロパティに変更が発生していないことがわかります。別のタブをクリックして最初のタブを選択すると、変更が反映されます。

Erno の編集: 私が理解できないのはこれです: ドキュメントの種類ごとに特別なメニューがあるとしましょう。特定のタブが 1 つ選択されているとします (独自のメニューが有効/表示され、もう 1 つのタブは折りたたまれています)。BaseProjectViewMode の PaneHeader プロパティの PropertyChanged を MainWindowViewModel の SelectedProjectName に反映するにはどうすればよいですか? 時間があれば、例でそれを示していただけますか? また、配線をしたい/する必要がある場合、別の方法は何ですか? 前もって感謝します。

4

1 に答える 1