public MainViewModel()
        {
            // タイトルに表示する文字列を指定
            var asm = Assembly.GetExecutingAssembly().GetName();

            AppName.Value = asm.Name + " - " + asm.Version.Major + "." + asm.Version.Minor;

            // 表示するリスト(filteredItemsSource)のソースとフィルタの設定
            FilteredItemsSource = new CollectionViewSource {
                Source = MemoList
            };
            FilteredItemsSource.Filter += (s, e) =>
            {
                var item = e.Item as SelfMemoItem;
                e.Accepted = CheckFilterStr(FilterStr.Value, item) && CheckCategoryFilter(item);
            };

            // ファイルが有ればロードしてMemoListを更新
            if (File.Exists(MemoFileName))
            {
                SelfMemoList.LoadMemoFile(MemoList, MemoFileName);
            }

            // MemoListが空なら、ヘルプメッセージ的な項目を追加する
            if (SelfMemoList.ItemsList.Count == 0)
            {
                MemoList.Add(new SelfMemoItem("用語", "正式名称、別名、訳語など", "用語の解説", "カテゴリ"));
                MemoList.Add(new SelfMemoItem("SelfMemo", "概要", "キーワードと関連情報(訳語、正式名称、説明など)を登録し、ど忘れした時に見返しやすくするアプリです。", "本アプリの説明"));
                MemoList.Add(new SelfMemoItem("SelfMemo", "検索機能", "検索フォームからキーワード検索ができます。", "本アプリの説明"));
                MemoList.Add(new SelfMemoItem("SelfMemo", "ショートカット", "グローバルホットキー(デフォルトでAlt+Shift+F2)でいつでもアプリ起動します。", "本アプリの説明"));
                MemoList.Add(new SelfMemoItem("SelfMemo", "項目追加", "メニューの「登録ダイアログを開く(Ctrl+R)」からキーワードの追加ができます。", "本アプリの説明"));
                MemoList.Add(new SelfMemoItem("SelfMemo", "項目編集", "編集ビューから登録内容の編集ができます。", "本アプリの説明"));
                MemoList.Add(new SelfMemoItem("SelfMemo", "カテゴリフィルタ", "「カテゴリ」メニューでカテゴリ毎の表示フィルタリングができます。", "本アプリの説明"));
            }

            // Filter文字列が更新されたら、Filterされたアイテムリストを更新
            FilterStr.Subscribe(_ =>
            {
                // 既にタイマーが走ってたら、一旦止める
                if (FilteredItemsRefreshTimer.IsEnabled)
                {
                    FilteredItemsRefreshTimer.Stop();
                }

                // タイマー開始
                FilteredItemsRefreshTimer.Interval = TimeSpan.FromMilliseconds(300);
                FilteredItemsRefreshTimer.Tick    += (s, e) =>
                {
                    FilteredItems.Refresh();
                    FilteredItemsRefreshTimer.Stop();
                };
                FilteredItemsRefreshTimer.Start();
            });

            // Filter文字列の有無フラグを連動
            UseFilterStr = FilterStr.Select(x => !string.IsNullOrWhiteSpace(x)).ToReadOnlyReactivePropertySlim();

            // カテゴリ選択ComboBoxが更新されたら、Filterされたアイテムリスト更新
            CategoryListSelected.Subscribe(_ =>
            {
                if (!FilteredItemsRefreshTimer.IsEnabled)
                {
                    FilteredItemsRefreshTimer.Interval = TimeSpan.FromMilliseconds(300);
                    FilteredItemsRefreshTimer.Tick    += (s, e) =>
                    {
                        FilteredItems.Refresh();
                        FilteredItemsRefreshTimer.Stop();
                    };
                    FilteredItemsRefreshTimer.Start();
                }
            });

            // 選択項目をSelectedItemに入れる処理
            FilteredItems.CurrentChanged += (s, e) =>
            {
                SelectedItem.Value = FilteredItems.CurrentItem as SelfMemoItem;
            };

            // UseCategoryListはカテゴリリストからなんか選択されてたらTrue
            UseCategoryList = CategoryListSelected.Select(x => !string.IsNullOrEmpty(x)).ToReadOnlyReactivePropertySlim();

            // カテゴリリストのON/OFFを切り替えるタイミングでもカテゴリリストの内容更新
            UseCategoryList.Subscribe(_ =>
            {
                SelfMemoList.UpdateCategoryList();
            });

            // MemoListのコレクションが更新されたらファイルに保存
            MemoList.CollectionChanged += (s, e) =>
            {
                SelfMemoList.SaveMemoFile(MemoList, MemoFileName);
            };

            WindowWidth.Subscribe(_ =>
            {
                ExpanderWidth.Value = Math.Max(400, WindowWidth.Value / 2);
            });
        }