OSDN Git Service

投稿できるようになった!
authorazyobuzin <azyobuzin@users.sourceforge.jp>
Thu, 19 May 2011 12:38:57 +0000 (21:38 +0900)
committerazyobuzin <azyobuzin@users.sourceforge.jp>
Thu, 19 May 2011 12:38:57 +0000 (21:38 +0900)
19 files changed:
HatenaDiaryClient/App.xaml.cs
HatenaDiaryClient/HatenaDiaryClient.csproj
HatenaDiaryClient/InfrastructureAssemblies/Design/Livet.Design.dll
HatenaDiaryClient/InfrastructureAssemblies/Design/Livet.Expression.Design.dll
HatenaDiaryClient/InfrastructureAssemblies/Design/Okazuki.BehaviorSupport.Design.Commons.dll [new file with mode: 0644]
HatenaDiaryClient/InfrastructureAssemblies/Design/Okazuki.BehaviorSupport.VisualStudio.Design.dll [new file with mode: 0644]
HatenaDiaryClient/InfrastructureAssemblies/Livet.XML
HatenaDiaryClient/InfrastructureAssemblies/Livet.dll
HatenaDiaryClient/InfrastructureAssemblies/Okazuki.BehaviorSupport.dll [new file with mode: 0644]
HatenaDiaryClient/Models/BlogItem.cs [new file with mode: 0644]
HatenaDiaryClient/Models/Hatena/HatenaDiary.cs
HatenaDiaryClient/Models/Hatena/HatenaFotolife.cs
HatenaDiaryClient/Models/Model.cs
HatenaDiaryClient/Models/Settings.cs [new file with mode: 0644]
HatenaDiaryClient/ViewModels/MainWindowViewModel.cs
HatenaDiaryClient/ViewModels/SettingsWindowViewModel.cs [new file with mode: 0644]
HatenaDiaryClient/Views/MainWindow.xaml
HatenaDiaryClient/Views/SettingsWindow.xaml [new file with mode: 0644]
HatenaDiaryClient/Views/SettingsWindow.xaml.cs [new file with mode: 0644]

index cce475c..e8ed518 100644 (file)
@@ -1,7 +1,6 @@
 using System;
 using System.Collections.Generic;
 using System.Configuration;
-using System.Data;
 using System.Linq;
 using System.Windows;
 
@@ -17,7 +16,7 @@ namespace Azyobuzi.HatenaDiaryClient
         private void Application_Startup(object sender, StartupEventArgs e)
         {
             DispatcherHelper.UIDispatcher = Dispatcher;
-            AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
+            //AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
         }
 
         //集約エラーハンドラ
index cb3a3e6..a1235a8 100644 (file)
   <ItemGroup>
     <Reference Include="Livet, Version=0.9.2011.429, Culture=neutral, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\..\..\..\AppData\Local\Temporary Projects\HatenaDiaryClient\InfrastructureAssemblies\Livet.dll</HintPath>
+      <HintPath>InfrastructureAssemblies\Livet.dll</HintPath>
     </Reference>
     <Reference Include="Microsoft.Expression.Interactions">
       <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\..\..\..\AppData\Local\Temporary Projects\HatenaDiaryClient\InfrastructureAssemblies\Microsoft.Expression.Interactions.dll</HintPath>
+      <HintPath>InfrastructureAssemblies\Microsoft.Expression.Interactions.dll</HintPath>
+    </Reference>
+    <Reference Include="Okazuki.BehaviorSupport, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>InfrastructureAssemblies\Okazuki.BehaviorSupport.dll</HintPath>
+      <Private>False</Private>
     </Reference>
     <Reference Include="System" />
-    <Reference Include="System.Data" />
     <Reference Include="System.Windows.Interactivity">
       <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\..\..\..\AppData\Local\Temporary Projects\HatenaDiaryClient\InfrastructureAssemblies\System.Windows.Interactivity.dll</HintPath>
+      <HintPath>InfrastructureAssemblies\System.Windows.Interactivity.dll</HintPath>
     </Reference>
     <Reference Include="System.Xml" />
     <Reference Include="Microsoft.CSharp" />
     <Reference Include="System.Core" />
     <Reference Include="System.Xml.Linq" />
-    <Reference Include="System.Data.DataSetExtensions" />
     <Reference Include="System.Xaml">
       <RequiredTargetFramework>4.0</RequiredTargetFramework>
     </Reference>
       <Generator>MSBuild:Compile</Generator>
       <SubType>Designer</SubType>
     </ApplicationDefinition>
+    <Compile Include="Models\Settings.cs" />
+    <Compile Include="ViewModels\SettingsWindowViewModel.cs" />
+    <Compile Include="Views\SettingsWindow.xaml.cs">
+      <DependentUpon>SettingsWindow.xaml</DependentUpon>
+    </Compile>
     <Page Include="Views\MainWindow.xaml">
       <Generator>MSBuild:Compile</Generator>
       <SubType>Designer</SubType>
@@ -74,6 +82,7 @@
       <DependentUpon>App.xaml</DependentUpon>
       <SubType>Code</SubType>
     </Compile>
+    <Compile Include="Models\BlogItem.cs" />
     <Compile Include="Models\Hatena\BlogEntry.cs" />
     <Compile Include="Models\Hatena\FotolifeEntry.cs" />
     <Compile Include="Models\Hatena\HatenaDiary.cs" />
       <DependentUpon>MainWindow.xaml</DependentUpon>
       <SubType>Code</SubType>
     </Compile>
+    <Page Include="Views\SettingsWindow.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
   </ItemGroup>
   <ItemGroup>
     <Compile Include="Properties\AssemblyInfo.cs">
     <Resource Include="Images\Send Document.png" />
     <Content Include="InfrastructureAssemblies\Design\Livet.Design.dll" />
     <Content Include="InfrastructureAssemblies\Design\Livet.Expression.Design.dll" />
+    <Content Include="InfrastructureAssemblies\Design\Okazuki.BehaviorSupport.Design.Commons.dll" />
+    <Content Include="InfrastructureAssemblies\Design\Okazuki.BehaviorSupport.VisualStudio.Design.dll" />
     <Content Include="InfrastructureAssemblies\Livet.dll" />
     <Resource Include="InfrastructureAssemblies\Livet.XML" />
     <Content Include="InfrastructureAssemblies\Microsoft.Expression.Interactions.dll" />
+    <Content Include="InfrastructureAssemblies\Okazuki.BehaviorSupport.dll" />
     <Content Include="InfrastructureAssemblies\System.Windows.Interactivity.dll" />
   </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
index 2ac2173..e97db52 100644 (file)
Binary files a/HatenaDiaryClient/InfrastructureAssemblies/Design/Livet.Design.dll and b/HatenaDiaryClient/InfrastructureAssemblies/Design/Livet.Design.dll differ
index 21edb5c..17eae77 100644 (file)
Binary files a/HatenaDiaryClient/InfrastructureAssemblies/Design/Livet.Expression.Design.dll and b/HatenaDiaryClient/InfrastructureAssemblies/Design/Livet.Expression.Design.dll differ
diff --git a/HatenaDiaryClient/InfrastructureAssemblies/Design/Okazuki.BehaviorSupport.Design.Commons.dll b/HatenaDiaryClient/InfrastructureAssemblies/Design/Okazuki.BehaviorSupport.Design.Commons.dll
new file mode 100644 (file)
index 0000000..e670af3
Binary files /dev/null and b/HatenaDiaryClient/InfrastructureAssemblies/Design/Okazuki.BehaviorSupport.Design.Commons.dll differ
diff --git a/HatenaDiaryClient/InfrastructureAssemblies/Design/Okazuki.BehaviorSupport.VisualStudio.Design.dll b/HatenaDiaryClient/InfrastructureAssemblies/Design/Okazuki.BehaviorSupport.VisualStudio.Design.dll
new file mode 100644 (file)
index 0000000..735fd73
Binary files /dev/null and b/HatenaDiaryClient/InfrastructureAssemblies/Design/Okazuki.BehaviorSupport.VisualStudio.Design.dll differ
index d1c659f..4b22e1a 100644 (file)
@@ -4,27 +4,32 @@
         <name>Livet</name>
     </assembly>
     <members>
-        <member name="T:Livet.Messaging.File.SelectOpenFileMessage">
+        <member name="T:Livet.IWeakEventListenerHaving">
             <summary>
-            ファイルを開く アクション用の相互作用メッセージです。
+            IWeakEventListenerのリストを持つクラスです。
+            通常このリストにIWeakEventListenerを追加することで、<br/>
+            IWeakEventListenerとこのインターフェースを実装したオブジェクトのライフサイクルを一致させます。
             </summary>
         </member>
-        <member name="T:Livet.Messaging.File.SelectFileMessage">
+        <member name="T:Livet.Behaviors.Messaging.DirectInteractionMessage">
             <summary>
-            ファイルを開く・ファイルを保存するアクション用の共通相互作用メッセージ基底抽象クラスです。<br/>
-            ファイルを開くアクションをViewに行わせたい場合は、SelectOpenFileMessageを使用してください。<br/>
-            ファイルを保存するアクションをViewに行わせたい場合は、SelectSaveFileMessageを使用してください。
+            Viewから直接相互作用メッセージを定義する際に使用します。
             </summary>
         </member>
-        <member name="T:Livet.Messaging.InteractionResponsibleMessage`1">
+        <member name="P:Livet.Behaviors.Messaging.DirectInteractionMessage.Message">
             <summary>
-            戻り値のある相互作用メッセージの基底クラスです。
+            相互作用メッセージ(各種InteractionMessage)を指定、または取得します。
             </summary>
-            <typeparam name="T"></typeparam>
         </member>
-        <member name="T:Livet.Messaging.InteractionResponsibleMessage">
+        <member name="P:Livet.Behaviors.Messaging.DirectInteractionMessage.CallbackCommand">
             <summary>
-            戻り値のある相互作用メッセージの抽象基底クラスです。
+            アクション実行後に実行するコマンドを指定、または取得します<br/>
+            このプロパティが設定されていた場合、アクションの実行後アクションの実行に使用した相互作用メッセージをパラメータとしてコマンドを呼び出します。
+            </summary>
+        </member>
+        <member name="T:Livet.Messaging.InformationMessage">
+            <summary>
+            情報をViewに通知するためのメッセージです。
             </summary>
         </member>
         <member name="T:Livet.Messaging.InteractionMessage">
             メッセージキーを指定、または取得します。
             </summary>
         </member>
-        <member name="M:Livet.Messaging.InteractionResponsibleMessage`1.#ctor(System.String)">
+        <member name="M:Livet.Messaging.InformationMessage.#ctor(System.String,System.String,System.String)">
             <summary>
-            メッセージキーを使用して、戻り値のある新しい相互作用メッセージのインスタンスを生成します
+            表示するメッセージ・キャプション・メッセージキーを指定して、新しい相互作用メッセージのインスタンスを生成します。
             </summary>
+            <param name="text">表示するメッセージ</param>
+            <param name="caption">キャプション</param>
             <param name="messageKey">メッセージキー</param>
         </member>
-        <member name="M:Livet.Messaging.InteractionResponsibleMessage`1.CreateInstanceCore">
-            <summary>
-            派生クラスでは必ずオーバーライドしてください。Freezableオブジェクトとして必要な実装です。<br/>
-            通常このメソッドは、自身の新しいインスタンスを返すように実装します。
-            </summary>
-            <returns>自身の新しいインスタンス</returns>
-        </member>
-        <member name="P:Livet.Messaging.InteractionResponsibleMessage`1.Response">
+        <member name="M:Livet.Messaging.InformationMessage.#ctor(System.String,System.String,System.Windows.MessageBoxImage,System.String)">
             <summary>
-            戻り値情報
+            表示するメッセージ・キャプション・メッセージボックスイメージ・メッセージキーを指定して、新しい相互作用メッセージのインスタンスを生成します。
             </summary>
+            <param name="text">表示するメッセージ</param>
+            <param name="caption">キャプション</param>
+            <param name="image">メッセージボックスイメージ</param>
+            <param name="messageKey">メッセージキー</param>
         </member>
-        <member name="M:Livet.Messaging.File.SelectFileMessage.CreateInstanceCore">
+        <member name="M:Livet.Messaging.InformationMessage.CreateInstanceCore">
             <summary>
             派生クラスでは必ずオーバーライドしてください。Freezableオブジェクトとして必要な実装です。<br/>
             通常このメソッドは、自身の新しいインスタンスを返すように実装します。
             </summary>
             <returns>自身の新しいインスタンス</returns>
         </member>
-        <member name="P:Livet.Messaging.File.SelectFileMessage.Title">
+        <member name="P:Livet.Messaging.InformationMessage.Text">
             <summary>
-            ダイアログタイトルを指定、または取得します。
+            表示するメッセージを指定、または取得します。
             </summary>
         </member>
-        <member name="P:Livet.Messaging.File.SelectFileMessage.Filter">
+        <member name="P:Livet.Messaging.InformationMessage.Caption">
             <summary>
-            ã\83\95ã\82¡ã\82¤ã\83«ã\81®æ\8b¡å¼µå­\90Filterを指定、または取得します。
+            ã\82­ã\83£ã\83\97ã\82·ã\83§ã\83³を指定、または取得します。
             </summary>
         </member>
-        <member name="P:Livet.Messaging.File.SelectFileMessage.AddExtension">
+        <member name="P:Livet.Messaging.InformationMessage.Image">
             <summary>
-            拡張子を指定しなかった場合、自動で拡張子を追加するかどうかを指定、または取得します。デフォルトはtrueです。
+            メッセージボックスイメージを指定、または取得します。
             </summary>
         </member>
-        <member name="M:Livet.Messaging.File.SelectOpenFileMessage.#ctor(System.String)">
+        <member name="T:Livet.ViewModel">
             <summary>
-            メッセージキーを指定して新しい相互作用メッセージのインスタンスを生成します。
+            ViewModelの基底クラスです。
             </summary>
-            <param name="messageKey">メッセージキー</param>
         </member>
-        <member name="M:Livet.Messaging.File.SelectOpenFileMessage.CreateInstanceCore">
+        <member name="T:Livet.NotifyObject">
             <summary>
-            派生クラスでは必ずオーバーライドしてください。Freezableオブジェクトとして必要な実装です。<br/>
-            通常このメソッドは、自身の新しいインスタンスを返すように実装します。
+            変更通知オブジェクトの基底クラスです。
             </summary>
-            <returns>自身の新しいインスタンス</returns>
         </member>
-        <member name="P:Livet.Messaging.File.SelectOpenFileMessage.MultiSelect">
+        <member name="M:Livet.NotifyObject.RaisePropertyChanged``1(System.Linq.Expressions.Expression{System.Func{``0}})">
             <summary>
-            複数ファイルを選択可能かを取得、または設定します。
+            プロパティ変更通知イベントを発生させます。
             </summary>
+            <param name="propertyExpression">() => プロパティ形式のラムダ式</param>
         </member>
-        <member name="T:Livet.Behaviors.Messaging.InteractionTransitionAction">
+        <member name="M:Livet.NotifyObject.RaisePropertyChanged(System.String)">
             <summary>
-            画面遷移(Window)を行うアクションです。TransitionMessageに対応します。
+            プロパティ変更通知イベントを発生させます
             </summary>
+            <param name="propertyName">プロパティ名</param>
         </member>
-        <member name="T:Livet.Behaviors.Messaging.InteractionMessageAction`1">
+        <member name="E:Livet.NotifyObject.PropertyChanged">
             <summary>
-            ViewModelからの相互作用メッセージに対応するアクションの基底抽象クラスです<br/>
-            独自のアクションを定義する場合はこのクラスを継承してください。
+            プロパティ変更通知イベントです。
             </summary>
-            <typeparam name="T">このアクションがアタッチ可能な型を示します。</typeparam>
         </member>
-        <member name="P:Livet.Behaviors.Messaging.InteractionMessageAction`1.DirectInteractionMessage">
+        <member name="P:Livet.NotifyObject.ListenerList">
             <summary>
-            Viewで直接相互作用メッセージを定義する場合に使用する、DirectInteractionMessageを指定、または取得します。
+            このクラスが購読するWeakEventのListenerの参照を確保するためのリストです。
+            このクラスインスタンスの生存期間の間、保持しておきたいIWeakEventLisntenerはこのリストに入れてください。
             </summary>
         </member>
-        <member name="P:Livet.Behaviors.Messaging.InteractionTransitionAction.WindowType">
+        <member name="P:Livet.ViewModel.Messenger">
             <summary>
-            遷移するウインドウの型を指定、または取得します。
+            このViewModelクラスの基本Messegerインスタンスです。
             </summary>
         </member>
-        <member name="P:Livet.Behaviors.Messaging.InteractionTransitionAction.Mode">
+        <member name="T:Livet.Messaging.ConfirmMessage">
             <summary>
-            画面遷移の種類を指定するTransitionMode列挙体を指定、または取得します。<br/>
-            TransitionMessageでModeがUnKnown以外に指定されていた場合、そちらが優先されます。
+            確認相互作用メッセージを表します。
             </summary>
         </member>
-        <member name="T:Livet.Messaging.Window.WindowActionMessage">
+        <member name="T:Livet.Messaging.InteractionResponsibleMessage`1">
             <summary>
-            Windowを最大化・最小化・閉じる・通常化させるための相互作用メッセージです。
+            戻り値のある相互作用メッセージの基底クラスです。
             </summary>
+            <typeparam name="T"></typeparam>
         </member>
-        <member name="M:Livet.Messaging.Window.WindowActionMessage.#ctor(System.String)">
+        <member name="T:Livet.Messaging.InteractionResponsibleMessage">
             <summary>
-            メッセージキーを指定して新しい相互作用メッセージのインスタンスを生成します。
+            戻り値のある相互作用メッセージの抽象基底クラスです。
             </summary>
-            <param name="messageKey">メッセージキー</param>
         </member>
-        <member name="M:Livet.Messaging.Window.WindowActionMessage.#ctor(System.String,Livet.Messaging.Window.WindowAction)">
+        <member name="M:Livet.Messaging.InteractionResponsibleMessage`1.#ctor(System.String)">
             <summary>
-            ã\83¡ã\83\83ã\82»ã\83¼ã\82¸ã\82­ã\83¼ã\81¨Windowã\81\8cé\81·ç§»ã\81\99ã\81¹ã\81\8dç\8a¶æ\85\8bã\82\92å®\9a義ã\81\97ã\81¦ã\80\81æ\96°ã\81\97ã\81\84ç\9b¸äº\92ä½\9cç\94¨ã\83¡ã\83\83ã\82»ã\83¼ã\82¸ã\81®ã\82¤ã\83³ã\82¹ã\82¿ã\83³ã\82¹ã\82\92ç\94\9fæ\88\90ã\81\97ã\81¾ã\81\99ã\80\82
+            ã\83¡ã\83\83ã\82»ã\83¼ã\82¸ã\82­ã\83¼ã\82\92使ç\94¨ã\81\97ã\81¦ã\80\81æ\88»ã\82\8aå\80¤ã\81®ã\81\82ã\82\8bæ\96°ã\81\97ã\81\84ç\9b¸äº\92ä½\9cç\94¨ã\83¡ã\83\83ã\82»ã\83¼ã\82¸ã\81®ã\82¤ã\83³ã\82¹ã\82¿ã\83³ã\82¹ã\82\92ç\94\9fæ\88\90ã\81\97ã\81¾ã\81\99
             </summary>
             <param name="messageKey">メッセージキー</param>
-            <param name="action">Windowが遷移すべき状態を表すWindowAction列挙体</param>
         </member>
-        <member name="M:Livet.Messaging.Window.WindowActionMessage.CreateInstanceCore">
+        <member name="M:Livet.Messaging.InteractionResponsibleMessage`1.CreateInstanceCore">
             <summary>
             派生クラスでは必ずオーバーライドしてください。Freezableオブジェクトとして必要な実装です。<br/>
             通常このメソッドは、自身の新しいインスタンスを返すように実装します。
             </summary>
             <returns>自身の新しいインスタンス</returns>
         </member>
-        <member name="P:Livet.Messaging.Window.WindowActionMessage.Action">
+        <member name="P:Livet.Messaging.InteractionResponsibleMessage`1.Response">
             <summary>
-            Windowが遷移すべき状態を表すWindowAction列挙体を指定、または取得します。
+            戻り値情報
             </summary>
         </member>
-        <member name="T:Livet.Behaviors.Messaging.Window.InteractionWindowAction">
+        <member name="M:Livet.Messaging.ConfirmMessage.#ctor(System.String,System.String,System.String)">
             <summary>
-            Windowの最小化・最大化・閉じるを行うアクションです。WindowActionMessageに対応します。
+            表示するメッセージ・キャプション・メッセージキーを指定して、新しい相互作用メッセージのインスタンスを生成します。
             </summary>
+            <param name="text">表示するメッセージ</param>
+            <param name="caption">キャプション</param>
+            <param name="messageKey">メッセージキー</param>
         </member>
-        <member name="F:Livet.Messaging.TransitionMode.Normal">
+        <member name="M:Livet.Messaging.ConfirmMessage.#ctor(System.String,System.String,System.Windows.MessageBoxImage,System.String)">
             <summary>
-            新しくWindowを開きます。
+            表示するメッセージ・キャプション・メッセージボックスイメージ・メッセージキーを指定して、新しい相互作用メッセージのインスタンスを生成します。
             </summary>
+            <param name="text">表示するメッセージ</param>
+            <param name="caption">キャプション</param>
+            <param name="image">メッセージボックスイメージ</param>
+            <param name="messageKey">メッセージキー</param>
         </member>
-        <member name="F:Livet.Messaging.TransitionMode.Modal">
+        <member name="M:Livet.Messaging.ConfirmMessage.#ctor(System.String,System.String,System.Windows.MessageBoxImage,System.Windows.MessageBoxButton,System.String)">
             <summary>
-            新しいWindowをモーダルダイアログとして開きます。
+            表示するメッセージ・キャプション・メッセージボックスイメージ・メッセージボックスボタン・メッセージキーを指定して、新しい相互作用メッセージのインスタンスを生成します。
             </summary>
+            <param name="text">表示するメッセージ</param>
+            <param name="caption">キャプション</param>
+            <param name="image">メッセージボックスイメージ</param>
+            <param name="button">メッセージボックスボタン</param>
+            <param name="messageKey">メッセージキー</param>
         </member>
-        <member name="F:Livet.Messaging.TransitionMode.NewOrActive">
+        <member name="M:Livet.Messaging.ConfirmMessage.CreateInstanceCore">
             <summary>
-            すでに同じ型のWindowが開かれている場合はそのWindowをアクティブにします。<br/>
-            同じ型のWindowが開かれていなかった場合、新しくWindowを開きます。
+            派生クラスでは必ずオーバーライドしてください。Freezableオブジェクトとして必要な実装です。<br/>
+            通常このメソッドは、自身の新しいインスタンスを返すように実装します。
             </summary>
+            <returns>自身の新しいインスタンス</returns>
         </member>
-        <member name="F:Livet.Messaging.TransitionMode.UnKnown">
+        <member name="P:Livet.Messaging.ConfirmMessage.Text">
             <summary>
-            指定されていません。Windowは表示されません
+            表示するメッセージを指定、または取得します
             </summary>
         </member>
-        <member name="T:Livet.ViewModelHelper">
+        <member name="P:Livet.Messaging.ConfirmMessage.Caption">
             <summary>
-            ViewModelの作成と実行をサポートするユーティリティクラスです。
+            キャプションを指定、または取得します。
             </summary>
         </member>
-        <member name="M:Livet.ViewModelHelper.CreateReadOnlyNotifyDispatcherCollection``2(System.Collections.ObjectModel.ObservableCollection{``1},System.Func{``1,``0},System.Windows.Threading.Dispatcher)">
+        <member name="P:Livet.Messaging.ConfirmMessage.Image">
             <summary>
-            既存のObservableCollectionと同期された、読み取り専用のDispatcherCollectionを作成します。
+            メッセージボックスイメージを指定、または取得します。
             </summary>
-            <typeparam name="TTargetItem">作成するReadOnlyNotifyDispatcherCollectionのコレクションアイテムの型</typeparam>
-            <typeparam name="TSourceItem">基となるObservableCollectionのコレクションアイテムの型</typeparam>
-            <param name="source">基となるObservableCollection</param>
-            <param name="create">TSourceItemからTTargetItemへの変換Func</param>
-            <param name="dispatcher">作成するコレクションに関連づけられるDispatcher</param>
-            <returns>ReadOnlyNotifyDispatcherCollection</returns>
         </member>
-        <member name="M:Livet.ViewModelHelper.BindNotifyChanged(System.ComponentModel.INotifyPropertyChanged,Livet.IWeakEventListenerHaving,System.ComponentModel.PropertyChangedEventHandler)">
+        <member name="P:Livet.Messaging.ConfirmMessage.Button">
             <summary>
-            ã\82¤ã\83\99ã\83³ã\83\88ã\83\8fã\83³ã\83\89ã\83©ã\81¨INotifyPropertyChanged(Modelã\80\81ã\81\82ã\82\8bã\81\84ã\81¯ä»\96ã\81®ViewModel)ã\81\8bã\82\89ã\81®PropertyChangedã\82¤ã\83\99ã\83³ã\83\88ã\82\92WeakEventã\81§ç´\90ã\81¥ã\81\91します。
+            ã\83¡ã\83\83ã\82»ã\83¼ã\82¸ã\83\9cã\83\83ã\82¯ã\82¹ã\83\9cã\82¿ã\83³ã\82\92æ\8c\87å®\9aã\80\81ã\81¾ã\81\9fã\81¯å\8f\96å¾\97します。
             </summary>
-            <param name="source">Model(INotifyPropertyChanged)</param>
-            <param name="lifecycleObject">このイベントの購読期間をそのライフサイクルと一致させたいオブジェクトです。通常このパラメータはViewModelを指します。</param>
-            <param name="handler">PropertyChangedEventHandler</param>
         </member>
-        <member name="M:Livet.ViewModelHelper.BindNotifyCollectionChanged(System.Collections.Specialized.INotifyCollectionChanged,Livet.IWeakEventListenerHaving,System.Collections.Specialized.NotifyCollectionChangedEventHandler)">
+        <member name="T:Livet.ReadOnlyNotifyDispatcherCollection`1">
             <summary>
-            イベントハンドラとINotifyCollectionChanged(ObservableCollection)からのCollectionChangedイベントをWeakEventで紐づけします。
+            DispatcherCollectionの読み取り専用ラッパーです。<br/>
+            ReadOnlyObservableCollectionなどと異なり、ソースコレクションの変更によってコレクションが変更された場合、<br/>
+            変更通知を行います。
             </summary>
-            <param name="source">INotifyCollectionChangedオブジェクト</param>
-            <param name="lifecycleObject">このイベントの購読期間をそのライフサイクルと一致させたいオブジェクトです。通常このパラメータはViewModelを指します。</param>
-            <param name="handler">NotifyCollectionChangedEventHandler</param>
+            <typeparam name="T">コレクションアイテムの型</typeparam>
         </member>
-        <member name="M:Livet.ViewModelHelper.BindNotification(Livet.Notificator,Livet.IWeakEventListenerHaving,System.EventHandler{Livet.NotificationRaisedEventArgs})">
+        <member name="P:Livet.ReadOnlyNotifyDispatcherCollection`1.Dispatcher">
             <summary>
-            ã\82¤ã\83\99ã\83³ã\83\88ã\83\8fã\83³ã\83\89ã\83©ã\81¨Notificatorã\81\8bã\82\89ã\81®Raisedã\82¤ã\83\99ã\83³ã\83\88ã\82\92WeakEventã\81§ç´\90ã\81¥ã\81\91します。
+            ã\81\93ã\81®ã\82³ã\83¬ã\82¯ã\82·ã\83§ã\83³ã\81\8cå¤\89æ\9b´é\80\9aç\9f¥ã\82\92è¡\8cã\81\86Dispatcherã\82\92å\8f\96å¾\97します。
             </summary>
-            <param name="source">Notificatorオブジェクト</param>
-            <param name="lifecycleObject">このイベントの購読期間をそのライフサイクルと一致させたいオブジェクトです。通常このパラメータはViewModelを指します。</param>
-            <param name="handler">EventHandler - NotificationRaisedEventArgs</param>
         </member>
-        <member name="T:Livet.Messaging.File.SelectSaveFileMessage">
+        <member name="P:Livet.ReadOnlyNotifyDispatcherCollection`1.ListenerList">
             <summary>
-            ファイルを保存する 用の相互作用メッセージです。
+            このクラスが購読するWeakEventのListenerの参照を確保するためのリストです。
+            このクラスインスタンスの生存期間の間、保持しておきたいIWeakEventLisntenerはこのリストに入れてください。
             </summary>
         </member>
-        <member name="M:Livet.Messaging.File.SelectSaveFileMessage.#ctor(System.String)">
+        <member name="T:Livet.Notificator`1">
             <summary>
-            メッセージキーを指定して新しい相互作用メッセージのインスタンスを生成します。
+            汎用変更通知オブジェクトです。通常ModelからViewModel(あるいは他のModelオブジェクト)への通知としてイベントの代わりに使用します。
             </summary>
-            <param name="messageKey">メッセージキー</param>
+            <typeparam name="T">イベント引数型</typeparam>
         </member>
-        <member name="M:Livet.Messaging.File.SelectSaveFileMessage.CreateInstanceCore">
+        <member name="M:Livet.Notificator`1.Raise(`0)">
             <summary>
-            派生クラスでは必ずオーバーライドしてください。Freezableオブジェクトとして必要な実装です。<br/>
-            通常このメソッドは、自身の新しいインスタンスを返すように実装します。
+            イベントをNotificatorを利用して通知します。
             </summary>
-            <returns>自身の新しいインスタンス</returns>
+            <param name="args">イベント引数う</param>
         </member>
-        <member name="P:Livet.Messaging.File.SelectSaveFileMessage.CreatePrompt">
+        <member name="E:Livet.Notificator`1.Raised">
             <summary>
-            ユーザーが存在しないファイルを指定した場合に、ファイルを作成することを確認するメッセージを表示するかどうかを指定、または取得します。デフォルトはfalseです。
+            通知が発生した時に発生するイベントです。
             </summary>
         </member>
-        <member name="P:Livet.Messaging.File.SelectSaveFileMessage.OverwritePrompt">
+        <member name="T:Livet.Behaviors.Messaging.InteractionMessageAction`1">
             <summary>
-            ユーザーが指定したファイルが存在する場合、上書き確認メッセージを表示するかどうかを指定、または取得します。デフォルトはtrueです。
+            ViewModelからの相互作用メッセージに対応するアクションの基底抽象クラスです<br/>
+            独自のアクションを定義する場合はこのクラスを継承してください。
             </summary>
+            <typeparam name="T">このアクションがアタッチ可能な型を示します。</typeparam>
         </member>
-        <member name="T:Livet.Behaviors.Messaging.File.InteractionOpenFileDialogAction">
+        <member name="P:Livet.Behaviors.Messaging.InteractionMessageAction`1.DirectInteractionMessage">
             <summary>
-            「ファイルを開く」ダイアログを表示するアクションです。SelectOpenFileMessageに対応します。
+            Viewで直接相互作用メッセージを定義する場合に使用する、DirectInteractionMessageを指定、または取得します。
             </summary>
         </member>
-        <member name="T:Livet.Notificator">
+        <member name="T:Livet.Behaviors.Messaging.InteractionInformationDialogAction">
             <summary>
-            æ±\8eç\94¨å¤\89æ\9b´é\80\9aç\9f¥ã\82ªã\83\96ã\82¸ã\82§ã\82¯ã\83\88ã\81§ã\81\99ã\80\82é\80\9a常Modelã\81\8bã\82\89ViewModelã\81¸ã\81®é\80\9aç\9f¥ã\81¨ã\81\97ã\81¦ã\82¤ã\83\99ã\83³ã\83\88ã\81®ä»£ã\82\8fã\82\8aã\81«ä½¿ç\94¨します。
+            æ\83\85å ±ã\83\80ã\82¤ã\82¢ã\83­ã\82°ã\82\92表示ã\81\99ã\82\8bã\82¢ã\82¯ã\82·ã\83§ã\83³ã\81§ã\81\99ã\80\82InformationMessageã\81«å¯¾å¿\9cします。
             </summary>
         </member>
-        <member name="M:Livet.Notificator.Raise(System.String)">
+        <member name="T:Livet.Behaviors.Messaging.Window.InteractionWindowAction">
             <summary>
-            識別子をつけて通知します。
+            Windowの最小化・最大化・閉じるを行うアクションです。WindowActionMessageに対応します。
             </summary>
-            <param name="token">識別子文字列</param>
         </member>
-        <member name="M:Livet.Notificator.Raise(System.Object,System.String)">
+        <member name="T:Livet.Behaviors.Messaging.InteractionTransitionAction">
             <summary>
-            識別子と付帯情報をつけて通知します。
+            画面遷移(Window)を行うアクションです。TransitionMessageに対応します。
             </summary>
-            <param name="eventInformation">付帯情報</param>
-            <param name="token">識別子文字列</param>
         </member>
-        <member name="E:Livet.Notificator.Raised">
+        <member name="P:Livet.Behaviors.Messaging.InteractionTransitionAction.WindowType">
             <summary>
-            é\80\9aç\9f¥ã\81\8cç\99ºç\94\9fã\81\97ã\81\9fæ\99\82ã\81«ç\99ºç\94\9fã\81\99ã\82\8bã\82¤ã\83\99ã\83³ã\83\88ã\81§す。
+            é\81·ç§»ã\81\99ã\82\8bã\82¦ã\82¤ã\83³ã\83\89ã\82¦ã\81®å\9e\8bã\82\92æ\8c\87å®\9aã\80\81ã\81¾ã\81\9fã\81¯å\8f\96å¾\97ã\81\97ã\81¾す。
             </summary>
         </member>
-        <member name="T:Livet.NotificationRaisedEventArgs">
+        <member name="P:Livet.Behaviors.Messaging.InteractionTransitionAction.Mode">
             <summary>
-            Notificatorが通知を行う際のイベント引数です。
+            画面遷移の種類を指定するTransitionMode列挙体を指定、または取得します。<br/>
+            TransitionMessageでModeがUnKnown以外に指定されていた場合、そちらが優先されます。
             </summary>
         </member>
-        <member name="M:Livet.NotificationRaisedEventArgs.#ctor(System.String)">
+        <member name="T:Livet.ViewModelHelper">
             <summary>
-            コンストラクタ
+            ViewModelの作成と実行をサポートするユーティリティクラスです。
             </summary>
-            <param name="token">識別子文字列</param>
         </member>
-        <member name="M:Livet.NotificationRaisedEventArgs.#ctor(System.Object,System.String)">
+        <member name="M:Livet.ViewModelHelper.CreateReadOnlyNotifyDispatcherCollection``2(System.Collections.ObjectModel.ObservableCollection{``1},System.Func{``1,``0},System.Windows.Threading.Dispatcher)">
             <summary>
-            コンストラクタ
+            既存のObservableCollectionと同期された、読み取り専用のDispatcherCollectionを作成します。
             </summary>
-            <param name="eventInformation">付帯情報</param>
-            <param name="token">識別子文字列</param>
+            <typeparam name="TTargetItem">作成するReadOnlyNotifyDispatcherCollectionのコレクションアイテムの型</typeparam>
+            <typeparam name="TSourceItem">基となるObservableCollectionのコレクションアイテムの型</typeparam>
+            <param name="source">基となるObservableCollection</param>
+            <param name="create">TSourceItemからTTargetItemへの変換Func</param>
+            <param name="dispatcher">作成するコレクションに関連づけられるDispatcher</param>
+            <returns>ReadOnlyNotifyDispatcherCollection</returns>
         </member>
-        <member name="P:Livet.NotificationRaisedEventArgs.Token">
+        <member name="M:Livet.ViewModelHelper.BindNotifyChanged(System.ComponentModel.INotifyPropertyChanged,Livet.ViewModel,System.ComponentModel.PropertyChangedEventHandler)">
             <summary>
-            識別子文字列
+            イベントハンドラとINotifyPropertyChanged(Model、あるいは他のViewModel)からのPropertyChangedイベントをWeakEventで紐づけします。
             </summary>
+            <param name="source">Model(INotifyPropertyChanged)</param>
+            <param name="lifecycleObject">このイベントの購読期間をそのライフサイクルと一致させたいViewModelです。</param>
+            <param name="handler">PropertyChangedEventHandler</param>
         </member>
-        <member name="P:Livet.NotificationRaisedEventArgs.EventInformation">
+        <member name="M:Livet.ViewModelHelper.BindNotifyCollectionChanged(System.Collections.Specialized.INotifyCollectionChanged,Livet.ViewModel,System.Collections.Specialized.NotifyCollectionChangedEventHandler)">
             <summary>
-            付帯情報
+            イベントハンドラとINotifyCollectionChanged(ObservableCollection)からのCollectionChangedイベントをWeakEventで紐づけします。
             </summary>
+            <param name="source">INotifyCollectionChangedオブジェクト</param>
+            <param name="lifecycleObject">このイベントの購読期間をそのライフサイクルと一致させたいViewModelです。</param>
+            <param name="handler">NotifyCollectionChangedEventHandler</param>
         </member>
-        <member name="T:Livet.Behaviors.Messaging.DirectInteractionMessage">
+        <member name="M:Livet.ViewModelHelper.BindNotification``1(Livet.Notificator{``0},Livet.ViewModel,System.EventHandler{``0})">
             <summary>
-            Viewから直接相互作用メッセージを定義する際に使用します。
+            イベントハンドラとNotificatorからのRaisedイベントをWeakEventで紐づけします。
             </summary>
+            <param name="source">Notificatorオブジェクト</param>
+            <param name="lifecycleObject">このイベントの購読期間をそのライフサイクルと一致させたいViewModelです。</param>
+            <param name="handler">EventHandler</param>
+            <typeparam name="T">イベント引数型</typeparam>
         </member>
-        <member name="P:Livet.Behaviors.Messaging.DirectInteractionMessage.Message">
+        <member name="T:Livet.Behaviors.Messaging.File.InteractionOpenFileDialogAction">
             <summary>
-            相互作用メッセージ(各種InteractionMessage)を指定、または取得します。
+            「ファイルを開く」ダイアログを表示するアクションです。SelectOpenFileMessageに対応します。
             </summary>
         </member>
-        <member name="P:Livet.Behaviors.Messaging.DirectInteractionMessage.CallbackCommand">
+        <member name="T:Livet.Command.DelegateCommand">
             <summary>
-            アクション実行後に実行するコマンドを指定、または取得します<br/>
-            このプロパティが設定されていた場合、アクションの実行後アクションの実行に使用した相互作用メッセージをパラメータとしてコマンドを呼び出します。
+            通常ViewModelで使用するコマンドクラスです。
             </summary>
         </member>
-        <member name="T:Livet.Command.DelegateCommand`1">
-            <summary>
-            通常ViewModelで使用するコマンドクラスです。
-            </summary>
-            <typeparam name="T">このコマンドを実行する際のパラメータの型</typeparam>
-        </member>
-        <member name="M:Livet.Command.DelegateCommand`1.#ctor(System.Action{`0})">
+        <member name="M:Livet.Command.DelegateCommand.#ctor(System.Action)">
             <summary>
             コマンドが実行するアクションを指定して、DelegateCommandの新しいインスタンスを作成します。
             </summary>
             <param name="execute">コマンドが実行するアクション</param>
         </member>
-        <member name="M:Livet.Command.DelegateCommand`1.#ctor(System.Action{`0},System.Func{`0,System.Boolean})">
+        <member name="M:Livet.Command.DelegateCommand.#ctor(System.Action,System.Func{System.Boolean})">
             <summary>
             コマンドが実行するアクションを指定して、DelegateCommandの新しいインスタンスを作成します。
             </summary>
             <param name="execute">コマンドが実行するアクション</param>
             <param name="canExecute">コマンドが実行可能かどうかを返すFunc</param>
         </member>
-        <member name="M:Livet.Command.DelegateCommand`1.CanExecute(`0)">
+        <member name="M:Livet.Command.DelegateCommand.CanExecute">
             <summary>
             コマンドが実行可能かを返します。
             </summary>
-            <param name="parameter">コマンドの実行に使用するパラメータ</param>
             <returns>コマンドの実行可非</returns>
         </member>
-        <member name="M:Livet.Command.DelegateCommand`1.System#Windows#Input#ICommand#CanExecute(System.Object)">
+        <member name="M:Livet.Command.DelegateCommand.System#Windows#Input#ICommand#CanExecute(System.Object)">
             <summary>
-            コマンドが実行可能かを返します
+            型引数を持たないDelegateCommandでは実行しないでください
             </summary>
-            <param name="parameter">コマンドの実行に使用するパラメータ</param>
-            <returns>コマンドの実行可非</returns>
+            <param name="parameter"></param>
+            <returns></returns>
         </member>
-        <member name="M:Livet.Command.DelegateCommand`1.Execute(`0)">
+        <member name="M:Livet.Command.DelegateCommand.Execute">
             <summary>
             このコマンドを実行します。
             </summary>
-            <param name="parameter">コマンドの実行に使用するパラメータ</param>
         </member>
-        <member name="M:Livet.Command.DelegateCommand`1.System#Windows#Input#ICommand#Execute(System.Object)">
+        <member name="M:Livet.Command.DelegateCommand.System#Windows#Input#ICommand#Execute(System.Object)">
             <summary>
-            このコマンドを実行します
+            型引数を持たないDelegateCommandでは実行しないでください
             </summary>
-            <param name="parameter">コマンドの実行に使用するパラメータ</param>
+            <param name="parameter"></param>
         </member>
-        <member name="M:Livet.Command.DelegateCommand`1.RaiseCanExecuteChanged">
+        <member name="M:Livet.Command.DelegateCommand.RaiseCanExecuteChanged">
             <summary>
             コマンドの実行可非状態が変化した事をCommandManagerに通知します。
             </summary>
         </member>
-        <member name="M:Livet.Command.DelegateCommand`1.RaisePropertyChanged(System.String)">
+        <member name="M:Livet.Command.DelegateCommand.RaisePropertyChanged(System.String)">
             <summary>
             プロパティ変更通知イベントを発生させます
             </summary>
             <param name="propertyName">プロパティ名</param>
         </member>
-        <member name="E:Livet.Command.DelegateCommand`1.CanExecuteChanged">
+        <member name="E:Livet.Command.DelegateCommand.CanExecuteChanged">
             <summary>
             コマンドの実行可非状態が変化した場合に発行されるイベントです。
             </summary>
         </member>
-        <member name="E:Livet.Command.DelegateCommand`1.PropertyChanged">
+        <member name="E:Livet.Command.DelegateCommand.PropertyChanged">
             <summary>
             プロパティ変更通知イベントです。
             </summary>
         </member>
-        <member name="T:Livet.Messaging.Window.WindowAction">
+        <member name="T:Livet.DispatcherCollection`1">
             <summary>
-            WindowActionMessageで使用する、Windowが遷移すべき状態を表します。
+            コレクション変更通知を指定されたDisptcher経由で行うコレクションです。
             </summary>
+            <typeparam name="T">コレクションアイテムの型</typeparam>
         </member>
-        <member name="F:Livet.Messaging.Window.WindowAction.Close">
+        <member name="P:Livet.DispatcherCollection`1.Dispatcher">
             <summary>
-            Windowを閉じます。
+            このコレクションに関連付けられたDispatcherを取得します。
             </summary>
         </member>
-        <member name="F:Livet.Messaging.Window.WindowAction.Maximize">
+        <member name="P:Livet.DispatcherCollection`1.CollectionChangedDispatcherPriority">
             <summary>
-            Windowを最大化します。
+            コレクション変更通知時のDispatcherPriorityを指定、または取得します。
             </summary>
         </member>
-        <member name="F:Livet.Messaging.Window.WindowAction.Minimize">
+        <member name="T:Livet.Messaging.File.SelectFileMessage">
             <summary>
-            Windowを最小化します。
+            ファイルを開く・ファイルを保存するアクション用の共通相互作用メッセージ基底抽象クラスです。<br/>
+            ファイルを開くアクションをViewに行わせたい場合は、SelectOpenFileMessageを使用してください。<br/>
+            ファイルを保存するアクションをViewに行わせたい場合は、SelectSaveFileMessageを使用してください。
             </summary>
         </member>
-        <member name="F:Livet.Messaging.Window.WindowAction.Normal">
+        <member name="M:Livet.Messaging.File.SelectFileMessage.CreateInstanceCore">
             <summary>
-            Windowを通常状態にします。
+            派生クラスでは必ずオーバーライドしてください。Freezableオブジェクトとして必要な実装です。<br/>
+            通常このメソッドは、自身の新しいインスタンスを返すように実装します。
             </summary>
+            <returns>自身の新しいインスタンス</returns>
         </member>
-        <member name="F:Livet.Messaging.Window.WindowAction.Active">
+        <member name="P:Livet.Messaging.File.SelectFileMessage.Title">
             <summary>
-            Windowをアクティブにします。
+            ダイアログタイトルを指定、または取得します。
             </summary>
         </member>
-        <member name="T:Livet.Behaviors.Messaging.InteractionInformationDialogAction">
+        <member name="P:Livet.Messaging.File.SelectFileMessage.Filter">
             <summary>
-            情報ダイアログを表示するアクションです。InformationMessageに対応します。
+            ファイルの拡張子Filterを指定、または取得します。
             </summary>
         </member>
-        <member name="T:Livet.ReadOnlyNotifyDispatcherCollection`1">
+        <member name="P:Livet.Messaging.File.SelectFileMessage.AddExtension">
             <summary>
-            DispatcherCollectionの読み取り専用ラッパーです。<br/>
-            ReadOnlyObservableCollectionなどと異なり、ソースコレクションの変更によってコレクションが変更された場合、<br/>
-            変更通知を行います。
+            拡張子を指定しなかった場合、自動で拡張子を追加するかどうかを指定、または取得します。デフォルトはtrueです。
             </summary>
-            <typeparam name="T">コレクションアイテムの型</typeparam>
         </member>
-        <member name="T:Livet.IWeakEventListenerHaving">
+        <member name="T:Livet.Command.DelegateCommand`1">
             <summary>
-            IWeakEventListenerのリストを持つクラスです。
-            通常このリストにIWeakEventListenerを追加することで、<br/>
-            IWeakEventListenerとこのインターフェースを実装したオブジェクトのライフサイクルを一致させます。
+            通常ViewModelで使用するコマンドクラスです。
             </summary>
+            <typeparam name="T">このコマンドを実行する際のパラメータの型</typeparam>
         </member>
-        <member name="P:Livet.ReadOnlyNotifyDispatcherCollection`1.Dispatcher">
+        <member name="M:Livet.Command.DelegateCommand`1.#ctor(System.Action{`0})">
             <summary>
-            ã\81\93ã\81®ã\82³ã\83¬ã\82¯ã\82·ã\83§ã\83³ã\81\8cå¤\89æ\9b´é\80\9aç\9f¥ã\82\92è¡\8cã\81\86Dispatcherã\82\92å\8f\96å¾\97します。
+            ã\82³ã\83\9eã\83³ã\83\89ã\81\8cå®\9fè¡\8cã\81\99ã\82\8bã\82¢ã\82¯ã\82·ã\83§ã\83³ã\82\92æ\8c\87å®\9aã\81\97ã\81¦ã\80\81DelegateCommandã\81®æ\96°ã\81\97ã\81\84ã\82¤ã\83³ã\82¹ã\82¿ã\83³ã\82¹ã\82\92ä½\9cæ\88\90します。
             </summary>
+            <param name="execute">コマンドが実行するアクション</param>
         </member>
-        <member name="P:Livet.ReadOnlyNotifyDispatcherCollection`1.Livet#IWeakEventListenerHaving#ListenerList">
+        <member name="M:Livet.Command.DelegateCommand`1.#ctor(System.Action{`0},System.Func{`0,System.Boolean})">
             <summary>
-            このクラスが購読するWeakEventのListenerの参照を確保するためのリストです。
-            このクラスインスタンスの生存期間の間、保持しておきたいIWeakEventLisntenerはこのリストに入れてください。
+            コマンドが実行するアクションを指定して、DelegateCommandの新しいインスタンスを作成します。
             </summary>
+            <param name="execute">コマンドが実行するアクション</param>
+            <param name="canExecute">コマンドが実行可能かどうかを返すFunc</param>
         </member>
-        <member name="T:Livet.DispatcherCollection`1">
+        <member name="M:Livet.Command.DelegateCommand`1.CanExecute(`0)">
             <summary>
-            ã\82³ã\83¬ã\82¯ã\82·ã\83§ã\83³å¤\89æ\9b´é\80\9aç\9f¥ã\82\92æ\8c\87å®\9aã\81\95ã\82\8cã\81\9fDisptcherçµ\8cç\94±ã\81§è¡\8cã\81\86ã\82³ã\83¬ã\82¯ã\82·ã\83§ã\83³ã\81§す。
+            ã\82³ã\83\9eã\83³ã\83\89ã\81\8cå®\9fè¡\8cå\8f¯è\83½ã\81\8bã\82\92è¿\94ã\81\97ã\81¾す。
             </summary>
-            <typeparam name="T">コレクションアイテムの型</typeparam>
+            <param name="parameter">コマンドの実行に使用するパラメータ</param>
+            <returns>コマンドの実行可非</returns>
         </member>
-        <member name="P:Livet.DispatcherCollection`1.Dispatcher">
+        <member name="M:Livet.Command.DelegateCommand`1.System#Windows#Input#ICommand#CanExecute(System.Object)">
             <summary>
-            ã\81\93ã\81®ã\82³ã\83¬ã\82¯ã\82·ã\83§ã\83³ã\81«é\96¢é\80£ä»\98ã\81\91ã\82\89ã\82\8cã\81\9fDispatcherã\82\92å\8f\96å¾\97します。
+            ã\82³ã\83\9eã\83³ã\83\89ã\81\8cå®\9fè¡\8cå\8f¯è\83½ã\81\8bã\82\92è¿\94します。
             </summary>
+            <param name="parameter">コマンドの実行に使用するパラメータ</param>
+            <returns>コマンドの実行可非</returns>
         </member>
-        <member name="P:Livet.DispatcherCollection`1.CollectionChangedDispatcherPriority">
+        <member name="M:Livet.Command.DelegateCommand`1.Execute(`0)">
             <summary>
-            ã\82³ã\83¬ã\82¯ã\82·ã\83§ã\83³å¤\89æ\9b´é\80\9aç\9f¥æ\99\82ã\81®DispatcherPriorityã\82\92æ\8c\87å®\9aã\80\81ã\81¾ã\81\9fã\81¯å\8f\96å¾\97します。
+            ã\81\93ã\81®ã\82³ã\83\9eã\83³ã\83\89ã\82\92å®\9fè¡\8cします。
             </summary>
+            <param name="parameter">コマンドの実行に使用するパラメータ</param>
         </member>
-        <member name="T:Livet.DispatcherHelper">
+        <member name="M:Livet.Command.DelegateCommand`1.System#Windows#Input#ICommand#Execute(System.Object)">
             <summary>
-            UIDispatcherへのアクセスを簡易化します。
+            このコマンドを実行します。
             </summary>
+            <param name="parameter">コマンドの実行に使用するパラメータ</param>
         </member>
-        <member name="M:Livet.DispatcherHelper.BeginInvoke(System.Action)">
+        <member name="M:Livet.Command.DelegateCommand`1.RaiseCanExecuteChanged">
             <summary>
-            UIDispatcherで指定されたアクションを実行します。
+            コマンドの実行可非状態が変化した事をCommandManagerに通知します。
             </summary>
-            <param name="action">アクション</param>
         </member>
-        <member name="M:Livet.DispatcherHelper.BeginInvoke(System.Action,System.Windows.Threading.DispatcherPriority)">
+        <member name="M:Livet.Command.DelegateCommand`1.RaisePropertyChanged(System.String)">
             <summary>
-            UIDispatcherで指定されたアクションを実行します。
+            プロパティ変更通知イベントを発生させます
             </summary>
-            <param name="action">アクション</param>
-            <param name="priority">DispatcherPriority</param>
+            <param name="propertyName">プロパティ名</param>
         </member>
-        <member name="P:Livet.DispatcherHelper.UIDispatcher">
+        <member name="E:Livet.Command.DelegateCommand`1.CanExecuteChanged">
             <summary>
-            UIDispatcherを指定、または取得します。通常このプロパティはApp_StartUpで指定されます。
+            コマンドの実行可非状態が変化した場合に発行されるイベントです。
             </summary>
         </member>
-        <member name="T:Livet.Behaviors.Messaging.File.InteractionSaveFileDialogAction">
+        <member name="E:Livet.Command.DelegateCommand`1.PropertyChanged">
             <summary>
-            ã\80\8cã\83\95ã\82¡ã\82¤ã\83«ã\82\92ä¿\9då­\98ã\81\99ã\82\8bã\80\8dã\83\80ã\82¤ã\82¢ã\83­ã\82°ã\82\92表示ã\81\99ã\82\8bã\82¢ã\82¯ã\82·ã\83§ã\83³ã\81§ã\81\99ã\80\82SelectSaveFileMessageã\81«å¯¾å¿\9cã\81\97ã\81¾す。
+            ã\83\97ã\83­ã\83\91ã\83\86ã\82£å¤\89æ\9b´é\80\9aç\9f¥ã\82¤ã\83\99ã\83³ã\83\88ã\81§す。
             </summary>
         </member>
-        <member name="T:Livet.NotifyObject">
+        <member name="F:Livet.Messaging.TransitionMode.Normal">
             <summary>
-            変更通知オブジェクトの基底クラスです。
+            新しくWindowを開きます。
             </summary>
         </member>
-        <member name="M:Livet.NotifyObject.RaisePropertyChanged(System.Linq.Expressions.Expression{System.Func{System.Object}})">
+        <member name="F:Livet.Messaging.TransitionMode.Modal">
             <summary>
-            プロパティ変更通知イベントを発生させます。
+            新しいWindowをモーダルダイアログとして開きます。
             </summary>
-            <param name="propertyExpression">() => プロパティ形式のラムダ式</param>
         </member>
-        <member name="M:Livet.NotifyObject.RaisePropertyChanged(System.String)">
+        <member name="F:Livet.Messaging.TransitionMode.NewOrActive">
             <summary>
-            プロパティ変更通知イベントを発生させます
+            すでに同じ型のWindowが開かれている場合はそのWindowをアクティブにします。<br/>
+            同じ型のWindowが開かれていなかった場合、新しくWindowを開きます。
             </summary>
-            <param name="propertyName">プロパティ名</param>
         </member>
-        <member name="E:Livet.NotifyObject.PropertyChanged">
+        <member name="F:Livet.Messaging.TransitionMode.UnKnown">
             <summary>
-            プロパティ変更通知イベントです
+            指定されていません。Windowは表示されません
             </summary>
         </member>
-        <member name="T:Livet.Messaging.ConfirmMessage">
+        <member name="T:Livet.Messaging.TransitionMessage">
             <summary>
-            ç¢ºèª\8dç\9b¸äº\92ä½\9cç\94¨ã\83¡ã\83\83ã\82»ã\83¼ã\82¸ã\82\92表ã\81\97ã\81¾す。
+            ç\94»é\9d¢é\81·ç§»ã\82¢ã\82¯ã\82·ã\83§ã\83³ç\94¨ã\81®ç\9b¸äº\92ä½\9cç\94¨ã\83¡ã\83\83ã\82»ã\83¼ã\82¸ã\81§す。
             </summary>
         </member>
-        <member name="M:Livet.Messaging.ConfirmMessage.#ctor(System.String,System.String,System.String)">
+        <member name="M:Livet.Messaging.TransitionMessage.#ctor(System.String)">
             <summary>
-            表示するメッセージ・キャプション・メッセージキーを指定して、新しい相互作用メッセージのインスタンスを生成します。
+            メッセージキーを指定して新しい相互作用メッセージのインスタンスを生成します。
             </summary>
-            <param name="text">表示するメッセージ</param>
-            <param name="caption">キャプション</param>
             <param name="messageKey">メッセージキー</param>
         </member>
-        <member name="M:Livet.Messaging.ConfirmMessage.#ctor(System.String,System.String,System.Windows.MessageBoxImage,System.String)">
+        <member name="M:Livet.Messaging.TransitionMessage.#ctor(Livet.ViewModel,System.String)">
             <summary>
-            表示するメッセージ・キャプション・メッセージボックスイメージ・メッセージキーを指定して、新しい相互作用メッセージのインスタンスを生成します。
+            新しいWindowのDataContextに設定するViewModelとメッセージキーを指定して新しい相互作用メッセージのインスタンスを生成します。
             </summary>
-            <param name="text">表示するメッセージ</param>
-            <param name="caption">キャプション</param>
-            <param name="image">メッセージボックスイメージ</param>
+            <param name="transitionViewModel">新しいWindowのDataContextに設定するViewModel</param>
             <param name="messageKey">メッセージキー</param>
         </member>
-        <member name="M:Livet.Messaging.ConfirmMessage.#ctor(System.String,System.String,System.Windows.MessageBoxImage,System.Windows.MessageBoxButton,System.String)">
+        <member name="M:Livet.Messaging.TransitionMessage.#ctor(Livet.ViewModel,Livet.Messaging.TransitionMode,System.String)">
             <summary>
-            表示するメッセージ・キャプション・メッセージボックスイメージ・メッセージボックスボタン・メッセージキーを指定して、新しい相互作用メッセージのインスタンスを生成します。
+            新しいWindowのDataContextに設定するViewModelとメッセージキーを指定して新しい相互作用メッセージのインスタンスを生成します。
             </summary>
-            <param name="text">表示するメッセージ</param>
-            <param name="caption">キャプション</param>
-            <param name="image">メッセージボックスイメージ</param>
-            <param name="button">メッセージボックスボタン</param>
+            <param name="transitionViewModel">新しいWindowのDataContextに設定するViewModel</param>
+            <param name="mode">画面遷移の方法を決定するTransitionMode列挙体。初期値はUnKnownです。</param>
             <param name="messageKey">メッセージキー</param>
         </member>
-        <member name="M:Livet.Messaging.ConfirmMessage.CreateInstanceCore">
+        <member name="M:Livet.Messaging.TransitionMessage.CreateInstanceCore">
             <summary>
             派生クラスでは必ずオーバーライドしてください。Freezableオブジェクトとして必要な実装です。<br/>
             通常このメソッドは、自身の新しいインスタンスを返すように実装します。
             </summary>
             <returns>自身の新しいインスタンス</returns>
         </member>
-        <member name="P:Livet.Messaging.ConfirmMessage.Text">
-            <summary>
-            表示するメッセージを指定、または取得します。
-            </summary>
-        </member>
-        <member name="P:Livet.Messaging.ConfirmMessage.Caption">
+        <member name="P:Livet.Messaging.TransitionMessage.TransitionViewModel">
             <summary>
-            キャプションを指定、または取得します。
+            新しいWindowのDataContextに設定するViewModelを指定、または取得します。
             </summary>
         </member>
-        <member name="P:Livet.Messaging.ConfirmMessage.Image">
+        <member name="P:Livet.Messaging.TransitionMessage.Mode">
             <summary>
-            メッセージボックスイメージを指定、または取得します。
+            新しいWindowの表示方法を決定するTransitionModeを指定、または取得します。<br/>
+            初期値はUnKnownです。
             </summary>
         </member>
-        <member name="P:Livet.Messaging.ConfirmMessage.Button">
+        <member name="T:Livet.Messaging.Window.WindowAction">
             <summary>
-            メッセージボックスボタンを指定、または取得します。
+            WindowActionMessageで使用する、Windowが遷移すべき状態を表します。
             </summary>
         </member>
-        <member name="T:Livet.Behaviors.Messaging.InteractionConfirmDialogAction">
+        <member name="F:Livet.Messaging.Window.WindowAction.Close">
             <summary>
-            確認ダイアログを表示するアクションです。ConfirmMessageに対応します。
+            Windowを閉じます。
             </summary>
         </member>
-        <member name="T:Livet.Messaging.InformationMessage">
+        <member name="F:Livet.Messaging.Window.WindowAction.Maximize">
             <summary>
-            情報をViewに通知するためのメッセージです。
+            Windowを最大化します。
             </summary>
         </member>
-        <member name="M:Livet.Messaging.InformationMessage.#ctor(System.String,System.String,System.String)">
+        <member name="F:Livet.Messaging.Window.WindowAction.Minimize">
             <summary>
-            表示するメッセージ・キャプション・メッセージキーを指定して、新しい相互作用メッセージのインスタンスを生成します。
+            Windowを最小化します。
             </summary>
-            <param name="text">表示するメッセージ</param>
-            <param name="caption">キャプション</param>
-            <param name="messageKey">メッセージキー</param>
         </member>
-        <member name="M:Livet.Messaging.InformationMessage.#ctor(System.String,System.String,System.Windows.MessageBoxImage,System.String)">
+        <member name="F:Livet.Messaging.Window.WindowAction.Normal">
             <summary>
-            表示するメッセージ・キャプション・メッセージボックスイメージ・メッセージキーを指定して、新しい相互作用メッセージのインスタンスを生成します。
+            Windowを通常状態にします。
             </summary>
-            <param name="text">表示するメッセージ</param>
-            <param name="caption">キャプション</param>
-            <param name="image">メッセージボックスイメージ</param>
-            <param name="messageKey">メッセージキー</param>
         </member>
-        <member name="M:Livet.Messaging.InformationMessage.CreateInstanceCore">
+        <member name="F:Livet.Messaging.Window.WindowAction.Active">
             <summary>
-            派生クラスでは必ずオーバーライドしてください。Freezableオブジェクトとして必要な実装です。<br/>
-            通常このメソッドは、自身の新しいインスタンスを返すように実装します。
+            Windowをアクティブにします。
             </summary>
-            <returns>自身の新しいインスタンス</returns>
         </member>
-        <member name="P:Livet.Messaging.InformationMessage.Text">
+        <member name="T:Livet.Behaviors.Messaging.File.InteractionSaveFileDialogAction">
             <summary>
-            表示するメッセージを指定、または取得します。
+            「ファイルを保存する」ダイアログを表示するアクションです。SelectSaveFileMessageに対応します。
             </summary>
         </member>
-        <member name="P:Livet.Messaging.InformationMessage.Caption">
+        <member name="T:Livet.Messaging.File.SelectOpenFileMessage">
             <summary>
-            ã\82­ã\83£ã\83\97ã\82·ã\83§ã\83³ã\82\92æ\8c\87å®\9aã\80\81ã\81¾ã\81\9fã\81¯å\8f\96å¾\97ã\81\97ã\81¾す。
+            ã\83\95ã\82¡ã\82¤ã\83«ã\82\92é\96\8bã\81\8f ã\82¢ã\82¯ã\82·ã\83§ã\83³ç\94¨ã\81®ç\9b¸äº\92ä½\9cç\94¨ã\83¡ã\83\83ã\82»ã\83¼ã\82¸ã\81§す。
             </summary>
         </member>
-        <member name="P:Livet.Messaging.InformationMessage.Image">
+        <member name="M:Livet.Messaging.File.SelectOpenFileMessage.#ctor(System.String)">
             <summary>
-            ã\83¡ã\83\83ã\82»ã\83¼ã\82¸ã\83\9cã\83\83ã\82¯ã\82¹ã\82¤ã\83¡ã\83¼ã\82¸ã\82\92æ\8c\87å®\9aã\80\81ã\81¾ã\81\9fã\81¯å\8f\96å¾\97します。
+            ã\83¡ã\83\83ã\82»ã\83¼ã\82¸ã\82­ã\83¼ã\82\92æ\8c\87å®\9aã\81\97ã\81¦æ\96°ã\81\97ã\81\84ç\9b¸äº\92ä½\9cç\94¨ã\83¡ã\83\83ã\82»ã\83¼ã\82¸ã\81®ã\82¤ã\83³ã\82¹ã\82¿ã\83³ã\82¹ã\82\92ç\94\9fæ\88\90します。
             </summary>
+            <param name="messageKey">メッセージキー</param>
         </member>
-        <member name="T:Livet.Behaviors.Messaging.InteractionMessageTrigger">
+        <member name="M:Livet.Messaging.File.SelectOpenFileMessage.CreateInstanceCore">
             <summary>
-            ViewModelからの相互作用メッセージを受信し、アクションを実行します。
+            派生クラスでは必ずオーバーライドしてください。Freezableオブジェクトとして必要な実装です。<br/>
+            通常このメソッドは、自身の新しいインスタンスを返すように実装します。
             </summary>
+            <returns>自身の新しいインスタンス</returns>
         </member>
-        <member name="P:Livet.Behaviors.Messaging.InteractionMessageTrigger.Messenger">
+        <member name="P:Livet.Messaging.File.SelectOpenFileMessage.MultiSelect">
             <summary>
-            ViewModelのMessengerを指定、または取得します。
+            複数ファイルを選択可能かを取得、または設定します。
             </summary>
         </member>
-        <member name="P:Livet.Behaviors.Messaging.InteractionMessageTrigger.MessageKey">
+        <member name="T:Livet.Messaging.InteractionMessenger">
             <summary>
-            このトリガーが反応する相互作用メッセージのメッセージキーを指定、または取得します。<br/>
-            このプロパティが指定されていない場合、このトリガーは全ての相互作用メッセージに反応します。
+            ViewModelで使用するMessengerクラスです。
             </summary>
         </member>
-        <member name="T:Livet.ViewModel">
+        <member name="M:Livet.Messaging.InteractionMessenger.Raise(Livet.Messaging.InteractionMessage)">
             <summary>
-            ViewModelの基底クラスです。
+            指定された相互作用メッセージを同期的に送信します。
             </summary>
+            <param name="message">相互作用メッセージ</param>
         </member>
-        <member name="P:Livet.ViewModel.Messenger">
+        <member name="M:Livet.Messaging.InteractionMessenger.RaiseAsync(Livet.Messaging.InteractionMessage)">
             <summary>
-            このViewModelクラスの基本Messegerインスタンスです。
+            指定された相互作用メッセージを非同期で送信します。
             </summary>
+            <param name="message">相互作用メッセージ</param>
         </member>
-        <member name="P:Livet.ViewModel.Livet#IWeakEventListenerHaving#ListenerList">
+        <member name="M:Livet.Messaging.InteractionMessenger.GetResponse``1(``0)">
             <summary>
-            このクラスが購読するWeakEventのListenerの参照を確保するためのリストです。
-            このクラスインスタンスの生存期間の間、保持しておきたいIWeakEventLisntenerはこのリストに入れてください。
+            指定された、戻り値情報のある相互作用メッセージを同期的に送信します。
             </summary>
+            <typeparam name="T">戻り値情報のある相互作用メッセージの型</typeparam>
+            <param name="message">戻り値情報のある相互作用メッセージ</param>
+            <returns>アクション実行後に、戻り情報を含んだ相互作用メッセージ</returns>
         </member>
-        <member name="T:Livet.Messaging.TransitionMessage">
+        <member name="M:Livet.Messaging.InteractionMessenger.GetResponseAsync``1(``0,System.Action{``0})">
             <summary>
-            画面遷移アクション用の相互作用メッセージです。
+            指定された、戻り値情報のある相互作用メッセージを非同期で送信します。
             </summary>
+            <typeparam name="T">戻り値情報のある相互作用メッセージの型</typeparam>
+            <param name="message">戻り値情報のある相互作用メッセージ</param>
+            <param name="callback">コールバック</param>
         </member>
-        <member name="M:Livet.Messaging.TransitionMessage.#ctor(System.String)">
+        <member name="E:Livet.Messaging.InteractionMessenger.Raised">
             <summary>
-            メッセージキーを指定して新しい相互作用メッセージのインスタンスを生成します。
+            相互作用メッセージが送信された時に発生するイベントです。
             </summary>
-            <param name="messageKey">メッセージキー</param>
         </member>
-        <member name="M:Livet.Messaging.TransitionMessage.#ctor(Livet.ViewModel,System.String)">
+        <member name="T:Livet.Messaging.InteractionMessageRaisedEventArgs">
             <summary>
-            新しいWindowのDataContextに設定するViewModelとメッセージキーを指定して新しい相互作用メッセージのインスタンスを生成します。
+            相互作用メッセージ送信時イベント用のイベント引数です。
             </summary>
-            <param name="transitionViewModel">新しいWindowのDataContextに設定するViewModel</param>
-            <param name="messageKey">メッセージキー</param>
         </member>
-        <member name="M:Livet.Messaging.TransitionMessage.#ctor(Livet.ViewModel,Livet.Messaging.TransitionMode,System.String)">
+        <member name="M:Livet.Messaging.InteractionMessageRaisedEventArgs.#ctor(Livet.Messaging.InteractionMessage)">
             <summary>
-            新しいWindowのDataContextに設定するViewModelとメッセージキーを指定して新しい相互作用メッセージのインスタンスを生成します。
+            コンストラクタ
             </summary>
-            <param name="transitionViewModel">新しいWindowのDataContextに設定するViewModel</param>
-            <param name="mode">画面遷移の方法を決定するTransitionMode列挙体。初期値はUnKnownです。</param>
-            <param name="messageKey">メッセージキー</param>
+            <param name="message">InteractionMessage</param>
         </member>
-        <member name="M:Livet.Messaging.TransitionMessage.CreateInstanceCore">
+        <member name="P:Livet.Messaging.InteractionMessageRaisedEventArgs.Message">
             <summary>
-            派生クラスでは必ずオーバーライドしてください。Freezableオブジェクトとして必要な実装です。<br/>
-            通常このメソッドは、自身の新しいインスタンスを返すように実装します。
+            送信されたメッセージ
             </summary>
-            <returns>自身の新しいインスタンス</returns>
         </member>
-        <member name="P:Livet.Messaging.TransitionMessage.TransitionViewModel">
+        <member name="T:Livet.Messaging.Window.WindowActionMessage">
             <summary>
-            新しいWindowのDataContextに設定するViewModelを指定、または取得します。
+            Windowを最大化・最小化・閉じる・通常化させるための相互作用メッセージです。
             </summary>
         </member>
-        <member name="P:Livet.Messaging.TransitionMessage.Mode">
+        <member name="M:Livet.Messaging.Window.WindowActionMessage.#ctor(System.String)">
             <summary>
-            新しいWindowの表示方法を決定するTransitionModeを指定、または取得します。<br/>
-            初期値はUnKnownです。
+            メッセージキーを指定して新しい相互作用メッセージのインスタンスを生成します。
             </summary>
+            <param name="messageKey">メッセージキー</param>
         </member>
-        <member name="T:Livet.Command.DelegateCommand">
+        <member name="M:Livet.Messaging.Window.WindowActionMessage.#ctor(System.String,Livet.Messaging.Window.WindowAction)">
             <summary>
-            通常ViewModelで使用するコマンドクラスです。
+            メッセージキーとWindowが遷移すべき状態を定義して、新しい相互作用メッセージのインスタンスを生成します。
             </summary>
+            <param name="messageKey">メッセージキー</param>
+            <param name="action">Windowが遷移すべき状態を表すWindowAction列挙体</param>
         </member>
-        <member name="M:Livet.Command.DelegateCommand.#ctor(System.Action)">
+        <member name="M:Livet.Messaging.Window.WindowActionMessage.CreateInstanceCore">
             <summary>
-            コマンドが実行するアクションを指定して、DelegateCommandの新しいインスタンスを作成します。
+            派生クラスでは必ずオーバーライドしてください。Freezableオブジェクトとして必要な実装です。<br/>
+            通常このメソッドは、自身の新しいインスタンスを返すように実装します。
             </summary>
-            <param name="execute">コマンドが実行するアクション</param>
+            <returns>自身の新しいインスタンス</returns>
         </member>
-        <member name="M:Livet.Command.DelegateCommand.#ctor(System.Action,System.Func{System.Boolean})">
+        <member name="P:Livet.Messaging.Window.WindowActionMessage.Action">
             <summary>
-            コマンドが実行するアクションを指定して、DelegateCommandの新しいインスタンスを作成します。
+            Windowが遷移すべき状態を表すWindowAction列挙体を指定、または取得します。
             </summary>
-            <param name="execute">コマンドが実行するアクション</param>
-            <param name="canExecute">コマンドが実行可能かどうかを返すFunc</param>
         </member>
-        <member name="M:Livet.Command.DelegateCommand.CanExecute">
+        <member name="T:Livet.NotificatorHelper">
             <summary>
-            コマンドが実行可能かを返します。
+            Notificatorをサポートします。
             </summary>
-            <returns>コマンドの実行可非</returns>
         </member>
-        <member name="M:Livet.Command.DelegateCommand.System#Windows#Input#ICommand#CanExecute(System.Object)">
+        <member name="M:Livet.NotificatorHelper.BindNotification``1(Livet.Notificator{``0},Livet.IWeakEventListenerHaving,System.EventHandler{``0})">
             <summary>
-            型引数を持たないDelegateCommandでは実行しないでください。
+            イベントハンドラとNotificatorからのRaisedイベントをWeakEventで紐づけします。ViewModelで利用する場合はViewModelHelperのメソッドを利用してください。
             </summary>
-            <param name="parameter"></param>
-            <returns></returns>
+            <param name="source">Notificatorオブジェクト</param>
+            <param name="lifecycleObject">このイベントの購読期間をそのライフサイクルと一致させたいIWeakEventListenerHavingオブジェクトです。</param>
+            <param name="handler">EventHandler</param>
+            <typeparam name="T">イベント引数型</typeparam>
         </member>
-        <member name="M:Livet.Command.DelegateCommand.Execute">
+        <member name="T:Livet.Behaviors.Messaging.InteractionMessageTrigger">
             <summary>
-            このコマンドを実行します。
+            ViewModelからの相互作用メッセージを受信し、アクションを実行します。
             </summary>
         </member>
-        <member name="M:Livet.Command.DelegateCommand.System#Windows#Input#ICommand#Execute(System.Object)">
+        <member name="P:Livet.Behaviors.Messaging.InteractionMessageTrigger.Messenger">
             <summary>
-            型引数を持たないDelegateCommandでは実行しないでください
+            ViewModelのMessengerを指定、または取得します
             </summary>
-            <param name="parameter"></param>
         </member>
-        <member name="M:Livet.Command.DelegateCommand.RaiseCanExecuteChanged">
+        <member name="P:Livet.Behaviors.Messaging.InteractionMessageTrigger.MessageKey">
             <summary>
-            コマンドの実行可非状態が変化した事をCommandManagerに通知します。
+            このトリガーが反応する相互作用メッセージのメッセージキーを指定、または取得します。<br/>
+            このプロパティが指定されていない場合、このトリガーは全ての相互作用メッセージに反応します。
             </summary>
         </member>
-        <member name="M:Livet.Command.DelegateCommand.RaisePropertyChanged(System.String)">
+        <member name="T:Livet.Behaviors.Messaging.InteractionConfirmDialogAction">
             <summary>
-            プロパティ変更通知イベントを発生させます
+            確認ダイアログを表示するアクションです。ConfirmMessageに対応します。
             </summary>
-            <param name="propertyName">プロパティ名</param>
         </member>
-        <member name="E:Livet.Command.DelegateCommand.CanExecuteChanged">
+        <member name="T:Livet.DispatcherHelper">
             <summary>
-            コマンドの実行可非状態が変化した場合に発行されるイベントです。
+            UIDispatcherへのアクセスを簡易化します。
             </summary>
         </member>
-        <member name="E:Livet.Command.DelegateCommand.PropertyChanged">
+        <member name="M:Livet.DispatcherHelper.BeginInvoke(System.Action)">
             <summary>
-            プロパティ変更通知イベントです。
+            UIDispatcherで指定されたアクションを実行します。
             </summary>
+            <param name="action">アクション</param>
         </member>
-        <member name="T:Livet.Messaging.InteractionMessenger">
+        <member name="M:Livet.DispatcherHelper.BeginInvoke(System.Action,System.Windows.Threading.DispatcherPriority)">
             <summary>
-            ViewModelで使用するMessengerクラスです。
+            UIDispatcherで指定されたアクションを実行します。
             </summary>
+            <param name="action">アクション</param>
+            <param name="priority">DispatcherPriority</param>
         </member>
-        <member name="M:Livet.Messaging.InteractionMessenger.Raise(Livet.Messaging.InteractionMessage)">
+        <member name="P:Livet.DispatcherHelper.UIDispatcher">
             <summary>
-            指定された相互作用メッセージを送信します。
+            UIDispatcherを指定、または取得します。通常このプロパティはApp_StartUpで指定されます。
             </summary>
-            <param name="message">相互作用メッセージ</param>
         </member>
-        <member name="M:Livet.Messaging.InteractionMessenger.GetResponse``1(``0)">
+        <member name="T:Livet.Messaging.File.SelectSaveFileMessage">
             <summary>
-            指定された、戻り値情報のある相互作用メッセージを送信します。
+            ファイルを保存する 用の相互作用メッセージです。
             </summary>
-            <typeparam name="T">戻り値情報のある相互作用メッセージの型</typeparam>
-            <param name="message">戻り値情報のある相互作用メッセージ</param>
-            <returns>アクション実行後に、戻り情報を含んだ相互作用メッセージ</returns>
         </member>
-        <member name="E:Livet.Messaging.InteractionMessenger.Raised">
+        <member name="M:Livet.Messaging.File.SelectSaveFileMessage.#ctor(System.String)">
             <summary>
-            相互作用メッセージが送信された時に発生するイベントです。
+            メッセージキーを指定して新しい相互作用メッセージのインスタンスを生成します。
             </summary>
+            <param name="messageKey">メッセージキー</param>
         </member>
-        <member name="T:Livet.Messaging.InteractionMessageRaisedEventArgs">
+        <member name="M:Livet.Messaging.File.SelectSaveFileMessage.CreateInstanceCore">
             <summary>
-            相互作用メッセージ送信時イベント用のイベント引数です。
+            派生クラスでは必ずオーバーライドしてください。Freezableオブジェクトとして必要な実装です。<br/>
+            通常このメソッドは、自身の新しいインスタンスを返すように実装します。
             </summary>
+            <returns>自身の新しいインスタンス</returns>
         </member>
-        <member name="M:Livet.Messaging.InteractionMessageRaisedEventArgs.#ctor(Livet.Messaging.InteractionMessage)">
+        <member name="P:Livet.Messaging.File.SelectSaveFileMessage.CreatePrompt">
             <summary>
-            ã\82³ã\83³ã\82¹ã\83\88ã\83©ã\82¯ã\82¿
+            ã\83¦ã\83¼ã\82¶ã\83¼ã\81\8cå­\98å\9c¨ã\81\97ã\81ªã\81\84ã\83\95ã\82¡ã\82¤ã\83«ã\82\92æ\8c\87å®\9aã\81\97ã\81\9få ´å\90\88ã\81«ã\80\81ã\83\95ã\82¡ã\82¤ã\83«ã\82\92ä½\9cæ\88\90ã\81\99ã\82\8bã\81\93ã\81¨ã\82\92確èª\8dã\81\99ã\82\8bã\83¡ã\83\83ã\82»ã\83¼ã\82¸ã\82\92表示ã\81\99ã\82\8bã\81\8bã\81©ã\81\86ã\81\8bã\82\92æ\8c\87å®\9aã\80\81ã\81¾ã\81\9fã\81¯å\8f\96å¾\97ã\81\97ã\81¾ã\81\99ã\80\82ã\83\87ã\83\95ã\82©ã\83«ã\83\88ã\81¯falseã\81§ã\81\99ã\80\82
             </summary>
-            <param name="message">InteractionMessage</param>
         </member>
-        <member name="P:Livet.Messaging.InteractionMessageRaisedEventArgs.Message">
+        <member name="P:Livet.Messaging.File.SelectSaveFileMessage.OverwritePrompt">
             <summary>
-            送信されたメッセージ
+            ユーザーが指定したファイルが存在する場合、上書き確認メッセージを表示するかどうかを指定、または取得します。デフォルトはtrueです。
             </summary>
         </member>
     </members>
index f4cb525..f80a848 100644 (file)
Binary files a/HatenaDiaryClient/InfrastructureAssemblies/Livet.dll and b/HatenaDiaryClient/InfrastructureAssemblies/Livet.dll differ
diff --git a/HatenaDiaryClient/InfrastructureAssemblies/Okazuki.BehaviorSupport.dll b/HatenaDiaryClient/InfrastructureAssemblies/Okazuki.BehaviorSupport.dll
new file mode 100644 (file)
index 0000000..8dfef06
Binary files /dev/null and b/HatenaDiaryClient/InfrastructureAssemblies/Okazuki.BehaviorSupport.dll differ
diff --git a/HatenaDiaryClient/Models/BlogItem.cs b/HatenaDiaryClient/Models/BlogItem.cs
new file mode 100644 (file)
index 0000000..7b00488
--- /dev/null
@@ -0,0 +1,72 @@
+using Azyobuzi.HatenaDiaryClient.Models.Hatena;
+using Livet;
+
+namespace Azyobuzi.HatenaDiaryClient.Models
+{
+    /// <summary>
+    /// BlogEntryのラッパー
+    /// </summary>
+    class BlogItem : NotifyObject
+    {
+        BlogEntry _Entry;
+
+        public BlogEntry Entry
+        {
+            get
+            { return _Entry; }
+            set
+            {
+                if (_Entry == value)
+                    return;
+                _Entry = value;
+                RaisePropertyChanged("Entry");
+            }
+        }
+        
+        BlogEntry _Draft;
+
+        public BlogEntry Draft
+        {
+            get
+            { return _Draft; }
+            set
+            {
+                if (_Draft == value)
+                    return;
+                _Draft = value;
+                RaisePropertyChanged("Draft");
+            }
+        }
+        
+        string _Title;
+
+        public string Title
+        {
+            get
+            { return _Title; }
+            set
+            {
+                if (_Title == value)
+                    return;
+                _Title = value;
+                RaisePropertyChanged("Title");
+            }
+        }
+        
+        string _Content;
+
+        public string Content
+        {
+            get
+            { return _Content; }
+            set
+            {
+                if (_Content == value)
+                    return;
+                _Content = value;
+                RaisePropertyChanged("Content");
+            }
+        }
+      
+    }
+}
index 73279f9..b47eceb 100644 (file)
@@ -9,22 +9,16 @@ namespace Azyobuzi.HatenaDiaryClient.Models.Hatena
 {
     public class HatenaDiary
     {
-        private string userName;
-        private string password;
-
-        public HatenaDiary(string userName, string password)
-        {
-            this.userName = userName;
-            this.password = password;
-        }
+        public string UserName { set; get; }
+        public string Password { set; get; }
 
         public Tuple<string, IEnumerable<BlogEntry>> GetEntrys(int page = 1)
         {
             var xdoc = WsseAtomConnection.Get(
-                string.Format("http://d.hatena.ne.jp/{0}/atom/blog?page={1}", this.userName, page),
+                string.Format("http://d.hatena.ne.jp/{0}/atom/blog?page={1}", this.UserName, page),
                 Encoding.UTF8,
-                this.userName,
-                this.password);
+                this.UserName,
+                this.Password);
             var title = xdoc.Root.Element(XmlNamespaces.Atom + "title").Value;
             var entrys = xdoc.Root.Elements(XmlNamespaces.Atom + "entry").Select(_ => new BlogEntry(_));
             return Tuple.Create(title, entrys);
@@ -43,11 +37,11 @@ namespace Azyobuzi.HatenaDiaryClient.Models.Hatena
         public BlogEntry PostEntry(string title, string content, DateTime? updated = null)
         {
             var reXml = WsseAtomConnection.Post(
-                string.Format("http://d.hatena.ne.jp/{0}/atom/blog", this.userName),
+                string.Format("http://d.hatena.ne.jp/{0}/atom/blog", this.UserName),
                 CreatePostEntryXml(title, content, updated),
                 Encoding.UTF8,
-                this.userName,
-                this.password);
+                this.UserName,
+                this.Password);
             return new BlogEntry(reXml.Root)
             {
                 HatenaSyntax = content
@@ -57,21 +51,21 @@ namespace Azyobuzi.HatenaDiaryClient.Models.Hatena
         public BlogEntry GetEntry(string dateId)
         {
             var xdoc = WsseAtomConnection.Get(
-                string.Format("http://d.hatena.ne.jp/{0}/atom/blog/{1}", this.userName, dateId),
+                string.Format("http://d.hatena.ne.jp/{0}/atom/blog/{1}", this.UserName, dateId),
                 Encoding.UTF8,
-                this.userName,
-                this.password);
+                this.UserName,
+                this.Password);
             return new BlogEntry(xdoc.Root);
         }
 
         public BlogEntry EditEntry(string dateId, string title, string content, DateTime? updated = null)
         {
             var reXml = WsseAtomConnection.Put(
-                string.Format("http://d.hatena.ne.jp/{0}/atom/blog/{1}", this.userName, dateId),
+                string.Format("http://d.hatena.ne.jp/{0}/atom/blog/{1}", this.UserName, dateId),
                 CreatePostEntryXml(title, content, updated),
                 Encoding.UTF8,
-                this.userName,
-                this.password);
+                this.UserName,
+                this.Password);
             return new BlogEntry(reXml.Root)
             {
                 HatenaSyntax = content
@@ -81,18 +75,18 @@ namespace Azyobuzi.HatenaDiaryClient.Models.Hatena
         public void DeleteEntry(string dateId)
         {
             WsseAtomConnection.Delete(
-                string.Format("http://d.hatena.ne.jp/{0}/atom/blog/{1}", this.userName, dateId),
-                this.userName,
-                this.password);
+                string.Format("http://d.hatena.ne.jp/{0}/atom/blog/{1}", this.UserName, dateId),
+                this.UserName,
+                this.Password);
         }
 
         public Tuple<string, IEnumerable<BlogEntry>> GetDrafts(int page = 1)
         {
             var xdoc = WsseAtomConnection.Get(
-                string.Format("http://d.hatena.ne.jp/{0}/atom/draft?page={1}", this.userName, page),
+                string.Format("http://d.hatena.ne.jp/{0}/atom/draft?page={1}", this.UserName, page),
                 Encoding.UTF8,
-                this.userName,
-                this.password);
+                this.UserName,
+                this.Password);
             var title = xdoc.Root.Element(XmlNamespaces.Atom + "title").Value;
             var entrys = xdoc.Root.Elements(XmlNamespaces.Atom + "entry").Select(_ => new BlogEntry(_));
             return Tuple.Create(title, entrys);
@@ -101,11 +95,11 @@ namespace Azyobuzi.HatenaDiaryClient.Models.Hatena
         public BlogEntry PostDraft(string title, string content, DateTime? updated = null)
         {
             var reXml = WsseAtomConnection.Post(
-                string.Format("http://d.hatena.ne.jp/{0}/atom/draft", this.userName),
+                string.Format("http://d.hatena.ne.jp/{0}/atom/draft", this.UserName),
                 CreatePostEntryXml(title, content, updated),
                 Encoding.UTF8,
-                this.userName,
-                this.password);
+                this.UserName,
+                this.Password);
             return new BlogEntry(reXml.Root)
             {
                 HatenaSyntax = content
@@ -115,21 +109,21 @@ namespace Azyobuzi.HatenaDiaryClient.Models.Hatena
         public BlogEntry GetDraft(string id)
         {
             var xdoc = WsseAtomConnection.Get(
-                string.Format("http://d.hatena.ne.jp/{0}/atom/draft/{1}", this.userName, id),
+                string.Format("http://d.hatena.ne.jp/{0}/atom/draft/{1}", this.UserName, id),
                 Encoding.UTF8,
-                this.userName,
-                this.password);
+                this.UserName,
+                this.Password);
             return new BlogEntry(xdoc.Root);
         }
 
         public BlogEntry EditDraft(string id, string title, string content, DateTime? updated = null)
         {
             var reXml = WsseAtomConnection.Put(
-                string.Format("http://d.hatena.ne.jp/{0}/atom/draft/{1}", this.userName, id),
+                string.Format("http://d.hatena.ne.jp/{0}/atom/draft/{1}", this.UserName, id),
                 CreatePostEntryXml(title, content, updated),
                 Encoding.UTF8,
-                this.userName,
-                this.password);
+                this.UserName,
+                this.Password);
             return new BlogEntry(reXml.Root)
             {
                 HatenaSyntax = content
@@ -139,9 +133,9 @@ namespace Azyobuzi.HatenaDiaryClient.Models.Hatena
         public void DeleteDraft(string id)
         {
             WsseAtomConnection.Delete(
-                string.Format("http://d.hatena.ne.jp/{0}/atom/draft/{1}", this.userName, id),
-                this.userName,
-                this.password);
+                string.Format("http://d.hatena.ne.jp/{0}/atom/draft/{1}", this.UserName, id),
+                this.UserName,
+                this.Password);
         }
 
         public BlogEntry PublishDraft(string id)
@@ -151,13 +145,13 @@ namespace Azyobuzi.HatenaDiaryClient.Models.Hatena
                     WsseAtomConnection.Put(
                         string.Format(
                             "http://d.hatena.ne.jp/{0}/atom/draft/{1}",
-                            this.userName,
+                            this.UserName,
                             id),
                         new NameValueCollection() { { "X-HATENA-PUBLISH", "1" } },
                         null,
                         Encoding.UTF8,
-                        this.userName,
-                        this.password)
+                        this.UserName,
+                        this.Password)
                 )
             );
         }
index bdb6cf9..79b7b9d 100644 (file)
@@ -9,14 +9,8 @@ namespace Azyobuzi.HatenaDiaryClient.Models.Hatena
 {
     public class HatenaFotolife
     {
-        private string userName;
-        private string password;
-
-        public HatenaFotolife(string userName, string password)
-        {
-            this.userName = userName;
-            this.password = password;
-        }
+        public string UserName { set; get; }
+        public string Password { set; get; }
 
         public FotolifeEntry Upload(string title, string fileName, string folder = null)
         {
@@ -81,8 +75,8 @@ namespace Azyobuzi.HatenaDiaryClient.Models.Hatena
                 "http://f.hatena.ne.jp/atom/post",
                 new XDocument(entry),
                 Encoding.GetEncoding("shift_jis"),
-                this.userName,
-                this.password);
+                this.UserName,
+                this.Password);
             return new FotolifeEntry(reXml.Root);
         }
 
@@ -92,8 +86,8 @@ namespace Azyobuzi.HatenaDiaryClient.Models.Hatena
                 WsseAtomConnection.Get(
                     "http://f.hatena.ne.jp/atom/edit/" + id,
                     Encoding.UTF8,
-                    this.userName,
-                    this.password
+                    this.UserName,
+                    this.Password
                 )
                 .Root
             );
@@ -113,16 +107,16 @@ namespace Azyobuzi.HatenaDiaryClient.Models.Hatena
                     .ToString()
                 ),
                 null,
-                this.userName,
-                this.password);
+                this.UserName,
+                this.Password);
         }
 
         public void DeleteEntry(string id)
         {
             WsseAtomConnection.Delete(
                 "http://f.hatena.ne.jp/atom/edit/" + id,
-                this.userName,
-                this.password);
+                this.UserName,
+                this.Password);
         }
 
         public IEnumerable<FotolifeEntry> GetEntrys(int page = 1)
@@ -130,8 +124,8 @@ namespace Azyobuzi.HatenaDiaryClient.Models.Hatena
             return WsseAtomConnection.Get(
                 "http://f.hatena.ne.jp/atom/feed?page=" + page.ToString(),
                 Encoding.UTF8,
-                this.userName,
-                this.password
+                this.UserName,
+                this.Password
             )
             .Root
             .Elements(XmlNamespaces.Atom02Spec + "entry")
index 0c75169..f09cf7c 100644 (file)
@@ -1,10 +1,13 @@
 using System;
 using System.Collections.Generic;
+using System.ComponentModel;
 using System.Linq;
 using System.Text;
 
 using Livet;
 
+using Azyobuzi.HatenaDiaryClient.Models.Hatena;
+
 namespace Azyobuzi.HatenaDiaryClient.Models
 {
     internal class Model : NotifyObject
@@ -12,5 +15,67 @@ namespace Azyobuzi.HatenaDiaryClient.Models
         /*
          * NotifyObjectはプロパティ変更通知の仕組みを実装したオブジェクトです。
          */
+
+        internal Model()
+        {
+            Editing = new BlogItem();
+        }
+
+        private Settings settings;
+        public Settings Settings
+        {
+            set
+            {
+                if (this.settings != null)
+                    this.settings.PropertyChanged -= this.Settings_PropertyChanged;
+                this.settings = value;
+                this.settings.PropertyChanged += this.Settings_PropertyChanged;
+                this.Settings_PropertyChanged(this.settings, new PropertyChangedEventArgs("HatenaId"));//キモい
+                this.RaisePropertyChanged("Settings");
+            }
+            get
+            {
+                if (this.settings == null)
+                    this.Settings = Settings.Load();
+                return this.settings;
+            }
+        }
+
+        private void Settings_PropertyChanged(object sender, PropertyChangedEventArgs e)
+        {
+            switch (e.PropertyName)
+            {
+                case "HatenaId":
+                case "Password":
+                    diary.UserName = this.Settings.HatenaId;
+                    diary.Password = this.Settings.Password;
+                    fotolife.UserName = this.Settings.HatenaId;
+                    fotolife.Password = this.Settings.Password;
+                    break;
+            }
+        }
+
+        /// <summary>
+        /// ID・パスワードが設定済みか
+        /// </summary>
+        public bool SetIdPassword
+        {
+            get
+            {
+                return !string.IsNullOrEmpty(this.Settings.HatenaId) &&
+                    !string.IsNullOrEmpty(this.Settings.Password);
+            }
+        }
+
+        private HatenaDiary diary = new HatenaDiary();
+        private HatenaFotolife fotolife = new HatenaFotolife();
+
+        public BlogItem Editing { private set; get; }
+
+        public void Post()
+        {
+            var re = diary.PostEntry(this.Editing.Title, this.Editing.Content);
+            this.Editing.Entry = re;
+        }
     }
 }
diff --git a/HatenaDiaryClient/Models/Settings.cs b/HatenaDiaryClient/Models/Settings.cs
new file mode 100644 (file)
index 0000000..4f52265
--- /dev/null
@@ -0,0 +1,78 @@
+using System;
+using System.IO;
+using System.Reflection;
+using System.Text;
+using System.Xml.Serialization;
+using Livet;
+
+namespace Azyobuzi.HatenaDiaryClient.Models
+{
+    public class Settings : NotifyObject, ICloneable
+    {
+        private static readonly string settingsFile =
+            Path.GetDirectoryName(Environment.GetCommandLineArgs()[0]) + @"\settings.xml";
+
+        private Settings() { }
+
+        string _HatenaId;
+
+        public string HatenaId
+        {
+            get
+            { return _HatenaId; }
+            set
+            {
+                if (_HatenaId == value)
+                    return;
+                _HatenaId = value;
+                RaisePropertyChanged("HatenaId");
+            }
+        }
+        
+        string _Password;
+
+        public string Password
+        {
+            get
+            { return _Password; }
+            set
+            {
+                if (_Password == value)
+                    return;
+                _Password = value;
+                RaisePropertyChanged("Password");
+            }
+        }
+                
+        public static Settings Load()
+        {
+            try
+            {
+                using (var sr = new StreamReader(settingsFile))
+                {
+                    var xs = new XmlSerializer(typeof(Settings));
+                    return (Settings)xs.Deserialize(sr);
+                }
+            }
+            catch
+            {
+                return new Settings();
+            }
+        }
+
+        public void Save()
+        {
+            using (var sw = new StreamWriter(settingsFile))
+            {
+                var xs = new XmlSerializer(typeof(Settings));
+                xs.Serialize(sw, this);
+            }
+        }
+
+        public object Clone()
+        {
+            this.Save();
+            return Load();
+        }
+    }
+}
index f45f935..3e90155 100644 (file)
@@ -3,6 +3,7 @@ using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.ComponentModel;
+using System.Reflection;
 
 using Livet;
 using Livet.Command;
@@ -14,7 +15,7 @@ using Azyobuzi.HatenaDiaryClient.Models;
 
 namespace Azyobuzi.HatenaDiaryClient.ViewModels
 {
-    public class MainWindowViewModel : ViewModel
+    class MainWindowViewModel : ViewModel
     {
         /*コマンド、プロパティの定義にはそれぞれ 
          * 
@@ -38,5 +39,85 @@ namespace Azyobuzi.HatenaDiaryClient.ViewModels
          * Modelからの変更通知などの各種イベントをそのままViewModelで購読する事はメモリリークの
          * 原因となりやすく推奨できません。ViewModelHelperの各静的メソッドの利用を検討してください。
          */
+
+        public MainWindowViewModel()
+        {
+            ViewModelHelper.BindNotifyChanged(this.model, this, (sender, e) =>
+            {
+                if (this.GetType().GetMember(e.PropertyName, BindingFlags.Instance | BindingFlags.GetProperty) != null)
+                {
+                    this.RaisePropertyChanged(e.PropertyName);
+                }
+            });
+        }
+
+        Model model = new Model();
+
+        public Settings Settings
+        {
+            set
+            {
+                model.Settings = value;
+            }
+            get
+            {
+                return model.Settings;
+            }
+        }
+
+        public BlogItem Editing
+        {
+            get
+            {
+                return model.Editing;
+            }
+        }
+
+        
+        #region PostCommand
+        DelegateCommand _PostCommand;
+
+        public DelegateCommand PostCommand
+        {
+            get
+            {
+                if (_PostCommand == null)
+                    _PostCommand = new DelegateCommand(Post, CanPost);
+                return _PostCommand;
+            }
+        }
+
+        private bool CanPost()
+        {
+            return this.model.SetIdPassword && !string.IsNullOrEmpty(this.Editing.Content);
+        }
+
+        private void Post()
+        {
+            this.model.Post();
+        }
+        #endregion
+        
+        #region ShowSettingsWindowCommand
+        DelegateCommand _ShowSettingsWindowCommand;
+
+        public DelegateCommand ShowSettingsWindowCommand
+        {
+            get
+            {
+                if (_ShowSettingsWindowCommand == null)
+                    _ShowSettingsWindowCommand = new DelegateCommand(ShowSettingsWindow);
+                return _ShowSettingsWindowCommand;
+            }
+        }
+
+        private void ShowSettingsWindow()
+        {
+            this.Messenger.Raise(new TransitionMessage(
+                new SettingsWindowViewModel(this.Settings),
+                "ShowSettingsWindow"));
+        }
+        #endregion
+      
     }
 }
diff --git a/HatenaDiaryClient/ViewModels/SettingsWindowViewModel.cs b/HatenaDiaryClient/ViewModels/SettingsWindowViewModel.cs
new file mode 100644 (file)
index 0000000..faedfcb
--- /dev/null
@@ -0,0 +1,85 @@
+using Azyobuzi.HatenaDiaryClient.Models;
+using Livet;
+using Livet.Command;
+using Livet.Messaging;
+using Livet.Messaging.Window;
+
+namespace Azyobuzi.HatenaDiaryClient.ViewModels
+{
+    class SettingsWindowViewModel : ViewModel
+    {
+        public SettingsWindowViewModel(Settings settings)
+        {
+            this.Settings = settings;
+        }
+
+        private Settings settings;
+
+        public Settings Settings
+        {
+            get { return settings; }
+            set
+            {
+                settings = value;
+
+                #region 設定読み取り
+                this.HatenaId = this.settings.HatenaId;
+                this.Password = this.settings.Password;
+                #endregion
+            }
+        }
+        
+
+        #region 設定項目
+        public string HatenaId { set; get; }
+        public string Password { set; get; }
+        #endregion
+
+        #region SaveCommand
+        DelegateCommand _SaveCommand;
+
+        public DelegateCommand SaveCommand
+        {
+            get
+            {
+                if (_SaveCommand == null)
+                    _SaveCommand = new DelegateCommand(Save);
+                return _SaveCommand;
+            }
+        }
+
+        private void Save()
+        {
+            this.Messenger.Raise(new InteractionMessage("ReqSetValues"));
+
+            #region 設定適用
+            this.Settings.HatenaId = this.HatenaId;
+            this.Settings.Password = this.Password;
+            #endregion
+
+            this.Settings.Save();
+            this.Cancel();
+        }
+        #endregion
+        
+        #region CancelCommand
+        DelegateCommand _CancelCommand;
+
+        public DelegateCommand CancelCommand
+        {
+            get
+            {
+                if (_CancelCommand == null)
+                    _CancelCommand = new DelegateCommand(Cancel);
+                return _CancelCommand;
+            }
+        }
+
+        private void Cancel()
+        {
+            this.Messenger.Raise(new WindowActionMessage("Close", WindowAction.Close));
+        }
+        #endregion
+      
+    }
+}
index 72ea60c..56ad10f 100644 (file)
@@ -6,11 +6,23 @@
         xmlns:l="http://schemas.livet-mvvm.net/2011/wpf"
         xmlns:v="clr-namespace:Azyobuzi.HatenaDiaryClient.Views"
         xmlns:vm="clr-namespace:Azyobuzi.HatenaDiaryClient.ViewModels"
-        Title="HatenaDiaryClient" Height="420" Width="600">
+        Title="HatenaDiaryClient"
+        Height="470" Width="600"
+        DataContext="{DynamicResource MainWindowViewModel}">
+   
+    <Window.Resources>
+        <vm:MainWindowViewModel x:Key="MainWindowViewModel"/>
+    </Window.Resources>
     
-    <Window.DataContext>
-        <vm:MainWindowViewModel/>
-    </Window.DataContext>
+    <i:Interaction.Triggers>
+        <l:InteractionMessageTrigger MessageKey="ShowSettingsWindow" Messenger="{Binding Messenger}">
+            <l:InteractionTransitionAction WindowType="v:SettingsWindow" Mode="Modal"/>
+        </l:InteractionMessageTrigger>
+        
+        <i:EventTrigger EventName="Closing">
+            <ei:CallMethodAction TargetObject="{Binding Settings}" MethodName="Save"/>
+        </i:EventTrigger>
+    </i:Interaction.Triggers>
     
     <Grid>
         <Grid.RowDefinitions>
         
         <Menu Grid.Row="0">
             <MenuItem Header="ファイル(_F)">
-
+                <MenuItem Header="設定(_O)" Command="{Binding ShowSettingsWindowCommand}"/>
             </MenuItem>
         </Menu>
         
-        <StackPanel Grid.Row="1" Orientation="Horizontal" Background="LightSteelBlue">
-            <StackPanel.Resources>
+        <WrapPanel Grid.Row="1" Orientation="Horizontal" Background="LightSteelBlue">
+            <WrapPanel.Resources>
                 <Style TargetType="Image">
                     <Setter Property="HorizontalAlignment" Value="Center"/>
                     <Setter Property="Width" Value="32"/>
                 <Style TargetType="Button">
                     <Setter Property="Width" Value="50"/>
                 </Style>
-            </StackPanel.Resources>
+            </WrapPanel.Resources>
             
-            <Button>
+            <Button Command="{Binding PostCommand}">
                 <StackPanel>
                     <Image Source="/HatenaDiaryClient;component/Images/Send%20Document.png" />
                     <TextBlock Text="投稿"/>
                 </StackPanel>
             </Button>
-        </StackPanel>
+        </WrapPanel>
         
         <Grid Grid.Row="2" Background="LightBlue">            
             <Grid.ColumnDefinitions>
@@ -56,9 +68,9 @@
             </Grid.ColumnDefinitions>
             
             <TextBlock Grid.Column="0" Text="タイトル :" Margin="3,3,3,3" VerticalAlignment="Center" Foreground="White"/>
-            <TextBox Grid.Column="1" Margin="3,3,3,3"/>
+            <TextBox Grid.Column="1" Margin="3,3,3,3" Text="{Binding Editing.Title, UpdateSourceTrigger=PropertyChanged}"/>
         </Grid>
         
-        <TextBox Grid.Row="3" TextWrapping="Wrap" AcceptsReturn="True" AcceptsTab="True" />
+        <TextBox Grid.Row="3" TextWrapping="Wrap" AcceptsReturn="True" AcceptsTab="True" Text="{Binding Editing.Content, UpdateSourceTrigger=PropertyChanged}"/>
     </Grid>
 </Window>
diff --git a/HatenaDiaryClient/Views/SettingsWindow.xaml b/HatenaDiaryClient/Views/SettingsWindow.xaml
new file mode 100644 (file)
index 0000000..5c9cffc
--- /dev/null
@@ -0,0 +1,74 @@
+<Window x:Class="Azyobuzi.HatenaDiaryClient.Views.SettingsWindow"
+        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+        xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
+        xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
+        xmlns:l="http://schemas.livet-mvvm.net/2011/wpf"
+        Title="設定"
+        Height="350" Width="400"
+        ShowInTaskbar="False"
+        WindowStartupLocation="CenterOwner">
+    
+    <i:Interaction.Triggers>
+        <l:InteractionMessageTrigger MessageKey="Close" Messenger="{Binding Messenger}">
+            <l:InteractionWindowAction/>
+        </l:InteractionMessageTrigger>
+    </i:Interaction.Triggers>
+    
+    <Grid>
+        <Grid.RowDefinitions>
+            <RowDefinition/>
+            <RowDefinition Height="auto"/>
+        </Grid.RowDefinitions>
+        <TabControl Grid.Row="0">
+            <TabControl.Resources>
+                <Style TargetType="TextBlock">
+                    <Setter Property="VerticalAlignment" Value="Center"/>
+                </Style>
+            </TabControl.Resources>
+            <TabControl.Items>
+                <TabItem Header="全般">
+                    <Grid Margin="5,5,5,5">
+                        <Grid.ColumnDefinitions>
+                            <ColumnDefinition Width="80"/>
+                            <ColumnDefinition Width="170"/>
+                        </Grid.ColumnDefinitions>
+                        <Grid.RowDefinitions>
+                            <RowDefinition Height="auto"/>
+                            <RowDefinition Height="auto"/>
+                        </Grid.RowDefinitions>
+                        
+                        <TextBlock Text="はてなID :" Grid.Column="0" Grid.Row="0"/>
+                        <TextBox Grid.Column="1" Grid.Row="0" Text="{Binding HatenaId}"/>
+                        
+                        <TextBlock Text="パスワード :" Grid.Column="0" Grid.Row="1"/>
+                        <PasswordBox Grid.Column="1" Grid.Row="1">
+                            <i:Interaction.Triggers>
+                                <i:EventTrigger EventName="Loaded">
+                                    <ei:ChangePropertyAction PropertyName="Password"
+                                                             Value="{Binding Password}"/>
+                                </i:EventTrigger>
+                                
+                                <l:InteractionMessageTrigger MessageKey="ReqSetValues" Messenger="{Binding Messenger}">
+                                    <l:PasswordBoxSetStateToSourceAction Property="Password"
+                                                                         Source="{Binding Password}"/>
+                                </l:InteractionMessageTrigger>
+                            </i:Interaction.Triggers>
+                        </PasswordBox>
+                    </Grid>
+                </TabItem>
+            </TabControl.Items>
+        </TabControl>
+        
+        <StackPanel Grid.Row="1" Orientation="Horizontal" HorizontalAlignment="Right">
+            <StackPanel.Resources>
+                <Style TargetType="Button">
+                    <Setter Property="Width" Value="80"/>
+                </Style>
+            </StackPanel.Resources>
+            
+            <Button Content="OK" Command="{Binding SaveCommand}"/>
+            <Button Content="キャンセル" Command="{Binding CancelCommand}"/>
+        </StackPanel>
+    </Grid>
+</Window>
diff --git a/HatenaDiaryClient/Views/SettingsWindow.xaml.cs b/HatenaDiaryClient/Views/SettingsWindow.xaml.cs
new file mode 100644 (file)
index 0000000..7c5a57c
--- /dev/null
@@ -0,0 +1,26 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Shapes;
+
+namespace Azyobuzi.HatenaDiaryClient.Views
+{
+    /// <summary>
+    /// SettingsWindow.xaml の相互作用ロジック
+    /// </summary>
+    public partial class SettingsWindow : Window
+    {
+        public SettingsWindow()
+        {
+            InitializeComponent();
+        }
+    }
+}