<?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>VB.NET</title><link>http://blogs.wankuma.com/katamari/category/1557.aspx</link><description>VB.NET</description><managingEditor>ＪＺ５ &lt;jz5@katamari.jp&gt;</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>ＪＺ５ &lt;jz5@katamari.jp&gt;</dc:creator><title>Bing Translator ツール 翻訳API その2</title><link>http://blogs.wankuma.com/katamari/archive/2009/07/09/177311.aspx</link><pubDate>Thu, 09 Jul 2009 23:58:00 GMT</pubDate><guid>http://blogs.wankuma.com/katamari/archive/2009/07/09/177311.aspx</guid><wfw:comment>http://blogs.wankuma.com/katamari/comments/177311.aspx</wfw:comment><comments>http://blogs.wankuma.com/katamari/archive/2009/07/09/177311.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.wankuma.com/katamari/comments/commentRss/177311.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/katamari/services/trackbacks/177311.aspx</trackback:ping><description>&lt;p&gt;前回： &lt;a href="http://blogs.wankuma.com/katamari/archive/2009/07/08/177234.aspx"&gt;Bing Translator ツール 翻訳API&lt;/a&gt;&lt;/p&gt; &lt;p&gt;　さくっと残りのメソッドも確認します。Microsoft Translator（サービスはBing Translatorで、技術的な名前としてはMicrosoft Translatorって感じかな） でサポートしている言語一覧を取得するにはGetLanguagesメソッドを使います。&lt;/p&gt; &lt;p&gt; &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:ff0871dd-d868-4ef6-84ff-29884c3dbab8" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="vb"&gt;Dim client = New ServiceReference1.LanguageServiceClient
For Each l In client.GetLanguages("取得した Application ID")
    Console.WriteLine(l)
Next&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;　これでjaやenといった文字列が取得できます。&lt;/p&gt;
&lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="実行結果" border="0" alt="実行結果" src="http://katamari.wankuma.com/images/BingTranslatorAPI2_14DCF/fileCUsersOwnerDocumentsVisualStudio2008ProjectstranslatorbinDebugtranslator.EXE3.png" width="71" height="311"&gt; &lt;/p&gt;
&lt;p&gt;　GetLanguagesの代わりに、GetLanguageNamesを使用すると指定した言語でサポートしている言語名が取得できます。&lt;/p&gt;
&lt;p&gt;
&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:c729592f-a09d-4c12-b38a-c2161ac5d5e1" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="vb"&gt;Dim client = New ServiceReference1.LanguageServiceClient
For Each l In client.GetLanguageNames("取得した Application ID", "ja")
    Console.WriteLine(l)
Next&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="実行結果" border="0" alt="実行結果" src="http://katamari.wankuma.com/images/BingTranslatorAPI2_14DCF/fileCUsersOwnerDocumentsVisualStudio2008ProjectstranslatorbinDebugtranslator.EXE2.png" width="128" height="310"&gt; &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;　さて、肝心の翻訳はTranslateメソッドを使います。引数は、Application ID、翻訳するテキスト、元の言語を示す文字列（jaなど）、翻訳先の言語を示す文字列（enなど）です。&lt;/p&gt;
&lt;p&gt;
&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:77151795-4a59-4534-ba22-b9aeb186c866" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="vb"&gt;Dim client = New ServiceReference1.LanguageServiceClient
Console.WriteLine(client.Translate("取得した Application ID", "こんにちは世界", "ja", "en"))
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="実行結果" border="0" alt="実行結果" src="http://katamari.wankuma.com/images/BingTranslatorAPI2_14DCF/fileCUsersOwnerDocumentsVisualStudio2008ProjectstranslatorbinDebugtranslator.EXE4.png" width="117" height="61"&gt; &lt;/p&gt;
&lt;p&gt;　簡単ですねー。これを使えば、以前紹介した翻訳系のWindows Live Writerのプラグインも作れちゃいそうですね（紹介したプラグインはすぐに公開されなくなってしまった）。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/katamari/aggbug/177311.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>ＪＺ５ &lt;jz5@katamari.jp&gt;</dc:creator><title>Bing Translator ツール 翻訳API</title><link>http://blogs.wankuma.com/katamari/archive/2009/07/08/177234.aspx</link><pubDate>Wed, 08 Jul 2009 22:36:00 GMT</pubDate><guid>http://blogs.wankuma.com/katamari/archive/2009/07/08/177234.aspx</guid><wfw:comment>http://blogs.wankuma.com/katamari/comments/177234.aspx</wfw:comment><comments>http://blogs.wankuma.com/katamari/archive/2009/07/08/177234.aspx#Feedback</comments><slash:comments>326</slash:comments><wfw:commentRss>http://blogs.wankuma.com/katamari/comments/commentRss/177234.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/katamari/services/trackbacks/177234.aspx</trackback:ping><description>&lt;p&gt;　&lt;a href="http://www.microsofttranslator.com/Tools/"&gt;Bing Translator ツール&lt;/a&gt; に開発者向けに翻訳用のSDKが公開されています。今日はこれを使ってみよう。Bing自体にも翻訳機能が付いたというニュースはあるのだけれど、全然機能が確認できないのよね。Webブラウザの言語を英語にしたり試みているのだけれど。それはさておき。&lt;/p&gt; &lt;p&gt;&lt;a href="http://katamari.wankuma.com/images/BingTranslatorAPI_139DC/BingTranslatorWindowsInternetExplorer.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Bing Translator ツール " border="0" alt="Bing Translator ツール " src="http://katamari.wankuma.com/images/BingTranslatorAPI_139DC/BingTranslatorWindowsInternetExplorer_thumb.png" width="420" height="315"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;　翻訳用のAPIは、同様の機能がAjax、HTTP、SOAPインターフェースの3種類が提供されています。.NET Frameworkから触るにはSOAPが激簡単だよねってことでこれを見てみます。&lt;/p&gt; &lt;p&gt;　はじめにApplication IDという識別子を取得しておく必要があります。これはLive Search時代のLive Search APIのものと共用のようですね。&lt;a href="http://www.bing.com/developers/createapp.aspx"&gt;Bing Developer Center&lt;/a&gt; から必要事項を入力してApplication IDを取得します。&lt;/p&gt; &lt;p&gt;&lt;a href="http://katamari.wankuma.com/images/BingTranslatorAPI_139DC/BingDeveloperCenterWindowsInternetExplorer.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Bing Developer Center" border="0" alt="Bing Developer Center" src="http://katamari.wankuma.com/images/BingTranslatorAPI_139DC/BingDeveloperCenterWindowsInternetExplorer_thumb.png" width="420" height="315"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;　鯉のぼり…だと…？　Application IDは、40文字ぐらいの0～9・A～Fの文字列です。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;　それではAPIを使ってみます。Visual Studioを起動して、ここではコンソールアプリケーションを選択しました。ソリューションエクスプローラからプロジェクトを右クリックして、サービス参照の追加を選択します。&lt;/p&gt; &lt;p&gt;　アドレス欄には「&lt;a href="http://api.microsofttranslator.com/V1/Soap.svc"&gt;http://api.microsofttranslator.com/V1/Soap.svc&lt;/a&gt;」と入力しましょう。移動ボタンをクリックします。メソッドが4個用意されていることがわかります。OKボタンもクリックしましょう。&lt;/p&gt; &lt;p&gt;&lt;a href="http://katamari.wankuma.com/images/BingTranslatorAPI_139DC/31bf80e88109.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="サービス参照の追加" border="0" alt="サービス参照の追加" src="http://katamari.wankuma.com/images/BingTranslatorAPI_139DC/_thumb.png" width="420" height="403"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;　コードを入力します。私ぐらいになるとフィーリングでわかります。嘘です。ですが、用意されているメソッドとその内容はとってもシンプル。Detectメソッドは入力テキストの言語を検出してくれるものです。&lt;/p&gt; &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:c7378285-8c3d-4bd4-9245-9ecf5012973d" class="wlWriterEditableSmartContent"&gt;&lt;pre name="code" class="vb"&gt;Sub Main()
    Dim client = New ServiceReference1.LanguageServiceClient
    Console.WriteLine(client.Detect("取得した Application ID", "こんにちは"))
    Console.ReadLine()
End Sub
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;　実行すると…、おお日本語(=ja)と判別されました。&lt;/p&gt;
&lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="実行結果" border="0" alt="実行結果" src="http://katamari.wankuma.com/images/BingTranslatorAPI_139DC/fileCUsersOwnerDocumentsVisualStudio2008ProjectstranslatorbinDebugtranslator.EXE.png" width="78" height="88"&gt; &lt;/p&gt;
&lt;p&gt;　今日はこのへんでいいでしょう（早っ）。残りのメソッドの使い方も超簡単です。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/katamari/aggbug/177234.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>ＪＺ５ &lt;jz5@katamari.jp&gt;</dc:creator><title>Silverlight UpdateSourceTrigger</title><link>http://blogs.wankuma.com/katamari/archive/2009/03/18/169877.aspx</link><pubDate>Wed, 18 Mar 2009 20:31:00 GMT</pubDate><guid>http://blogs.wankuma.com/katamari/archive/2009/03/18/169877.aspx</guid><wfw:comment>http://blogs.wankuma.com/katamari/comments/169877.aspx</wfw:comment><comments>http://blogs.wankuma.com/katamari/archive/2009/03/18/169877.aspx#Feedback</comments><slash:comments>226</slash:comments><wfw:commentRss>http://blogs.wankuma.com/katamari/comments/commentRss/169877.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/katamari/services/trackbacks/169877.aspx</trackback:ping><description>&lt;p&gt;　SilverlightではUpdateSourceTriggerが使えない。でも使いたい。検索してみると、Forumにそれを実現するコードがあるので書いてみました。&lt;/p&gt; &lt;p&gt;&lt;a href="http://silverlight.net/forums/t/11547.aspx"&gt;Binding.UpdateSourceTrigger : The Official Microsoft Silverlight Site&lt;/a&gt;&lt;/p&gt; &lt;p&gt;　VB.NETに変換して……。&lt;/p&gt; &lt;p&gt; &lt;div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:8d5c54b6-11b1-4003-ad80-4c3ff65a721d" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="vb"&gt;Public Class UpdateSourceTriggerHelper
    Public Shared ReadOnly UpdateSourceTriggerProperty As DependencyProperty = _
        DependencyProperty.RegisterAttached("UpdateSourceTrigger", GetType(Boolean), GetType(UpdateSourceTriggerHelper), New PropertyMetadata(AddressOf OnUpdateSourceTriggerChanged))

    Public Shared Function GetUpdateSourceTrigger(ByVal d As DependencyObject) As Boolean
        Return CBool(d.GetValue(UpdateSourceTriggerProperty))
    End Function

    Public Shared Sub SetUpdateSourceTrigger(ByVal d As DependencyObject, ByVal value As Boolean)
        d.SetValue(UpdateSourceTriggerProperty, value)
    End Sub

    Private Shared _textBox As TextBox

    Private Shared Sub OnUpdateSourceTriggerChanged(ByVal d As DependencyObject, ByVal e As DependencyPropertyChangedEventArgs)
        If Not TypeOf d Is TextBox Then
            Exit Sub
        End If
        _textBox = DirectCast(d, TextBox)
        If CBool(e.OldValue) Then
            RemoveHandler _textBox.TextChanged, AddressOf TextBox_TextChanged
        End If
        If CBool(e.NewValue) Then
            AddHandler _textBox.TextChanged, AddressOf TextBox_TextChanged
        End If
    End Sub

    Private Shared Sub TextBox_TextChanged(ByVal sender As Object, ByVal e As EventArgs)
        Dim c = FindFocusableControl(_textBox)
        If c IsNot Nothing Then
            c.Focus()
        End If
        _textBox.Focus()
    End Sub

    Private Shared Function FindFocusableControl(ByVal control As Control) As Control
        Dim ctl = VisualTreeHelper.GetParent(control)
        If TypeOf ctl Is Control Then
            Return DirectCast(ctl, Control)
        Else
            Dim childrenCount = VisualTreeHelper.GetChildrenCount(ctl)
            For i = 0 To childrenCount - 1
                Dim c = TryCast(VisualTreeHelper.GetChild(ctl, i), Control)
                If c IsNot Nothing AndAlso Not c Is control Then
                    Return c
                End If
            Next
        End If
        Return Nothing
    End Function
End Class
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;XAMLはこんな感じ。&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:f8eb40b5-07ff-4470-a72a-debe9e0d2949" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;TextBox Text="{Binding Hoge, Mode=TwoWay}" 
	local:UpdateSourceTriggerHelper.UpdateSourceTrigger="True" /&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;　処理内容は、TextChangedイベントが発生したらまわりのコントロールを探して、一度フォーカスを別のコントロールに変えて、またTextBoxに戻すというもの。これでUpdateSourceTriggerみたいに振舞うようにするってことですね。&lt;/p&gt;
&lt;p&gt;　実際にうごかしてみると、フォーカスが移動しているということは見た目状わかりませんが、だーーーーめがっさ英語圏的な実装じゃないかこれ。入力中にフォーカス移動させたら日本語打てないじゃん……。難しいなあ。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/katamari/aggbug/169877.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>ＪＺ５ &lt;jz5@katamari.jp&gt;</dc:creator><title>smtp.live.comでメール送信</title><link>http://blogs.wankuma.com/katamari/archive/2009/03/11/169483.aspx</link><pubDate>Wed, 11 Mar 2009 01:01:00 GMT</pubDate><guid>http://blogs.wankuma.com/katamari/archive/2009/03/11/169483.aspx</guid><wfw:comment>http://blogs.wankuma.com/katamari/comments/169483.aspx</wfw:comment><comments>http://blogs.wankuma.com/katamari/archive/2009/03/11/169483.aspx#Feedback</comments><slash:comments>12</slash:comments><wfw:commentRss>http://blogs.wankuma.com/katamari/comments/commentRss/169483.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/katamari/services/trackbacks/169483.aspx</trackback:ping><description>&lt;p&gt;　先日（といっても結構たちましたかね）に、Live HotmailでSMTP認証が使えるようになりました。Liveメールを使用している私には特に関係ない話しだったんですが（Live Hotmail=Webメール、Liveメール=メールクライアント）、プログラムからメール送信に使いたいと思って調べてみた。&lt;/p&gt; &lt;p&gt;　公式ヘルプを見たのだけど、わかりにくい！　ニュースとしてはSMTP認証が使える！　ってことが取り上げられていたと思うけどヘルプにはそんなこと書いてなくて、「Microsoft Outlook に電子メール アカウントを追加する」の「POP3 サーバーを使用して Microsoft Outlook に Windows Live Hotmail の電子メール アカウントを追加する」としてちらりとSMTPサーバーのアドレスが書いてあります。&lt;/p&gt; &lt;p&gt;　そんなわけでコードで書くと以下の通り。認証とSSL通信使用がポイントかな？　値を変えるだけでGMailもいけました。ポートは25番ですが、たいていのプロバイダでは使えないと思うので変更が必要です。&lt;/p&gt; &lt;p&gt; &lt;div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e85563df-97f6-4d9f-b12d-18a5e9be587d" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="vb"&gt;Public Shared Sub Send()

    Dim title = "件名"
    Dim body = "本文"
    Dim toAddress = "jz5あlive.jp".Replace("あ", "@") ' 宛先
    Dim fromAddress = "jz5あlive.jp".Replace("あ", "@") ' 差出人

    Dim smtpServer = "smtp.live.com" ' SMTPサーバー
    Dim port = 25 ' ポート番号

    Dim userName = "jz5あlive.jp".Replace("あ", "@") ' Live ID メールアドレス
    Dim password = "*****" ' Live ID パスワード

    Dim encoding = System.Text.Encoding.UTF8
    Dim message As New MailMessage()

    With message
        .SubjectEncoding = encoding
        .BodyEncoding = encoding
        .From = New MailAddress(fromAddress, "ＪＺ５", encoding)
        .To.Add(New MailAddress(toAddress, "ＪＺ５", encoding))
        .Subject = title
        .Body = body
    End With

    Dim client = New SmtpClient() With { _
            .Host = smtpServer, _
            .Port = port, _
            .Credentials = New NetworkCredential(userName, password), _
            .EnableSsl = True}

    client.Send(message) ' 送信
End Sub&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/katamari/aggbug/169483.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>ＪＺ５ &lt;jz5@katamari.jp&gt;</dc:creator><title>Silverlight DataGrid マウスホイールでスクロール</title><link>http://blogs.wankuma.com/katamari/archive/2009/03/11/169472.aspx</link><pubDate>Wed, 11 Mar 2009 00:26:00 GMT</pubDate><guid>http://blogs.wankuma.com/katamari/archive/2009/03/11/169472.aspx</guid><wfw:comment>http://blogs.wankuma.com/katamari/comments/169472.aspx</wfw:comment><comments>http://blogs.wankuma.com/katamari/archive/2009/03/11/169472.aspx#Feedback</comments><slash:comments>51</slash:comments><wfw:commentRss>http://blogs.wankuma.com/katamari/comments/commentRss/169472.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/katamari/services/trackbacks/169472.aspx</trackback:ping><description>&lt;p&gt;　Silverlight 使い始めました。マウスホイールでスクロールできないなんて……。以下、ほとんど文章だけなんでわかりにくいと思いますが。&lt;/p&gt; &lt;p&gt;　DataGridをマウスホイール対応するには、以前kazukiさんが書かれていますね。&lt;a href="http://blogs.wankuma.com/kazuki/archive/2008/11/13/161221.aspx"&gt;[C#][Silverlight]DataGridのマウスホイールでのスクロール その２&lt;/a&gt; この方法は選択行を変える方法でしたが、もっと自然な動作させる実装が、&lt;a href="http://www.pyro.jp/blog/2008/11/silverlight_datagrid.html"&gt;Silverlight2.0 - DataGridをホイールマウススクロールに対応させる - PYRO :: Blog&lt;/a&gt; にありました。すっごいぬるぬる動くよ！&lt;/p&gt; &lt;p&gt;　後者は、LoadingRowとUnloadingRowイベントにより現在表示されている行の最大と最小のインデックス値を保持しておいて、スクロール時にインデックス±1の行へスクロールするという手法です。&lt;/p&gt; &lt;p&gt;　が、こっちもソートすると、うまく動いてくれませんでした。最初はソートされてもインデックス値が変わらないのかなと思ったのですが、きちんとインデックス値は変わっていました。ソート時に表示されている行だけLoadingRow、UnloadingRowイベントが発生しますが、昇順 or 降順に発生しないので最大と最小の行のインデックス値がおかしくなってしまうっぽい。&lt;/p&gt; &lt;p&gt;　そこで、LoadingRow、UnloadingRowイベントで現在表示されている行のインデックスすべてを保持するように変えてみました。&lt;/p&gt; &lt;p&gt; &lt;div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:753241f6-7a68-45f1-b449-974a7316218f" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="vb"&gt;Private indexs As New List(Of Integer)

Private Shadows Sub OnLoadingRow(ByVal sender As Object, ByVal args As DataGridRowEventArgs)
    If Not indexs.Contains(args.Row.GetIndex) Then
        indexs.Add(args.Row.GetIndex)
    End If
End Sub

Private Shadows Sub OnUnloadingRow(ByVal sender As Object, ByVal args As DataGridRowEventArgs)
    If indexs.Contains(args.Row.GetIndex) Then
        indexs.Remove(args.Row.GetIndex)
    End If
End Sub&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;　ScrollIntoViewsメソッドで対象の行へスクロールするのだけど、ここで問題が。メソッドにはItemsSourcesにあるオブジェクトを指定するのだけど、IList型にキャストしてインデックス値から導き出すとItemsSource自体はソートされていないので、スクロールした位置にあるオブジェクトを指定できないのね（元のコードはListにキャストしてるけどおなじだよね？ Listってなに？）。&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:854676d1-6353-406e-b6d8-52883672f49b" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="vb"&gt;Dim s = DirectCast(ItemsSource, System.Collections.IList)
Dim i As Integer
If mousedelta &amp;lt; 0 Then
    i = indexs.Max + 1
ElseIf mousedelta &amp;gt; 0 Then
    i = indexs.Min - 1
End If

If i &amp;lt; 0 Then
    i = 0
ElseIf i &amp;gt; s.Count - 1 Then
    i = s.Count - 1
End If
Me.ScrollIntoView(s(i), Me.Columns(0))&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;　ItemsSourceに指定するコレクションとキャストする型を考えればなんとかなりそう！　ってことでたどり着いたのが、CollectionViewModel。よくは読んでいないのだけど、&lt;a href="http://blog.sharplab.net/computer/cprograming/wpf/1842/comment-page-1"&gt;M-V-VMパターンについてのエントリを訳してみた3　原題"CollectionViewModel"&lt;/a&gt; から原文に行ってサンプルをダウンロードして該当クラスだけとりだして使ってみると一応動きました（ItemsSourceとキャストにはICollectionView、行数を取得するのにIList型にもキャストして使用）。&lt;/p&gt;
&lt;p&gt;　ソートしてもきちんとマウスホイールでスクロールできるのだけど、ものすごいCollectionViewModel生成のところかな？　時間がかかる。150行ぐらいなのだけど、ブラウザが固まってしまう……。ううーむ？　←今ここ。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/katamari/aggbug/169472.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>ＪＺ５ &lt;jz5@katamari.jp&gt;</dc:creator><title>WPF Toolkit DataGrid DisplayIndex</title><link>http://blogs.wankuma.com/katamari/archive/2009/03/03/169101.aspx</link><pubDate>Tue, 03 Mar 2009 00:00:00 GMT</pubDate><guid>http://blogs.wankuma.com/katamari/archive/2009/03/03/169101.aspx</guid><wfw:comment>http://blogs.wankuma.com/katamari/comments/169101.aspx</wfw:comment><comments>http://blogs.wankuma.com/katamari/archive/2009/03/03/169101.aspx#Feedback</comments><slash:comments>299</slash:comments><wfw:commentRss>http://blogs.wankuma.com/katamari/comments/commentRss/169101.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/katamari/services/trackbacks/169101.aspx</trackback:ping><description>&lt;p&gt;　このところめがっさフィードを確認してないけど（Googleリーダーはずっと1000+だぜ！）、コードはいろいろ書いてます。この前からWPF ToolkitのDataGridをさわってるのだけど、いろいろむずかしいわぁ。やりたいことがなかなかできない。&lt;/p&gt; &lt;p&gt;　カラムの並び替えを記憶および再現する際にDisplayIndexが使えるってこの前書いたけど、設定順？によっては落ちてしまう場合があるようですね。当然、0～カラム数-1の範囲で設定している状態です。&lt;/p&gt; &lt;p&gt; &lt;div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:de8f0e96-b62f-46f9-8c1b-c52bb97fd7cf" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="vb:nocontrols"&gt;'datagrid: Microsoft.Windows.Controls.DataGrid
datagrid.Columns(0).DisplayIndex = 2
datagrid.Columns(1).DisplayIndex = 1
datagrid.Columns(2).DisplayIndex = 0
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;　情報も見つからなくて正しい方法がわからないのだけど、とりあえず毎回DisplayIndexを設定するときにUpdateLayoutメソッドを呼ぶと正常に動作するようです。&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:8ca8bc78-436f-468b-804a-f640be66d9b1" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="vb:nocontrols"&gt;datagrid.UpdateLayout&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;　スタイル設定の動作などとってもDataGridたいへんです……。まだ解決してない事項がいろいろと。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/katamari/aggbug/169101.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>ＪＺ５ &lt;jz5@katamari.jp&gt;</dc:creator><title>プロパティを検証するコード　＠MVVM</title><link>http://blogs.wankuma.com/katamari/archive/2009/02/25/168803.aspx</link><pubDate>Wed, 25 Feb 2009 20:01:00 GMT</pubDate><guid>http://blogs.wankuma.com/katamari/archive/2009/02/25/168803.aspx</guid><wfw:comment>http://blogs.wankuma.com/katamari/comments/168803.aspx</wfw:comment><comments>http://blogs.wankuma.com/katamari/archive/2009/02/25/168803.aspx#Feedback</comments><slash:comments>272</slash:comments><wfw:commentRss>http://blogs.wankuma.com/katamari/comments/commentRss/168803.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/katamari/services/trackbacks/168803.aspx</trackback:ping><description>&lt;p&gt;　今朝 通勤途中、紙のMSDNマガジン（英語）を読んでいたのだけど（あまり読めないので（英語的な意味で）内容がどんなのあるか確認する程度）、WPF MVVMパターン良さそうですね → &lt;a href="http://msdn.microsoft.com/ja-jp/magazine/dd419663.aspx"&gt;WPF のための MODEL-VIEW-VIEWMODEL (MVVM) デザイン パターン&lt;/a&gt;　すでにkazukiさんがエントリされてました（流石）→ &lt;a href="http://blogs.wankuma.com/kazuki/archive/2009/02/23/168586.aspx"&gt;[WPF][C#]Model View ViewModelパターンでハローワールド&lt;/a&gt;&lt;/p&gt; &lt;p&gt;　パターンとは少し関係ないかもだけど、記事中のプロパティを検証するコードが良い感じですね。INotifyPropertyChangedインターフェースを使うと、プロパティ名を文字列で扱うのでスペルミスしてしまうことがあるんですよね。それの対策コード。&lt;/p&gt; &lt;div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:b8105f17-ad25-460f-9daa-c8a77e8bbea4" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="vb"&gt;Public Event PropertyChanged(ByVal sender As Object, ByVal e As PropertyChangedEventArgs) Implements INotifyPropertyChanged.PropertyChanged

Public Sub OnPropertyChanged(ByVal propertyName As String)
    Me.VerifyPropertyName(propertyName)
    RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName))
End Sub

&amp;lt;Conditional("DEBUG"), DebuggerStepThrough()&amp;gt; _
Public Sub VerifyPropertyName(ByVal propertyName As String)
    If TypeDescriptor.GetProperties(Me)(propertyName) Is Nothing Then
        Dim msg As String = "Invalid property name: " &amp;amp; propertyName
        If Me.ThrowOnInvalidPropertyName Then
            Throw New Exception(msg)
        Else
            Debug.Fail(msg)
        End If
    End If
End Sub

Private privateThrowOnInvalidPropertyName As Boolean = True
Protected Overridable Property ThrowOnInvalidPropertyName() As Boolean
    Get
        Return privateThrowOnInvalidPropertyName
    End Get
    Set(ByVal value As Boolean)
        privateThrowOnInvalidPropertyName = value
    End Set
End Property

&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;　詳しくは記事＆コードで（まだ読んでない）。VB.NETでもコードサンプルが提供されていることに少し感動したｗ&lt;/p&gt;
&lt;p&gt;&lt;a href="http://code.msdn.microsoft.com/mag200902MVVM/Release/ProjectReleases.aspx?ReleaseId=2026"&gt;Code for "WPF Apps With the Model-View-ViewModel Design Pattern" - Release: Initial Release&lt;/a&gt;&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/katamari/aggbug/168803.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>ＪＺ５ &lt;jz5@katamari.jp&gt;</dc:creator><title>WPF Toolkit DataGrid ContextMenuとクリック処理</title><link>http://blogs.wankuma.com/katamari/archive/2009/01/30/167142.aspx</link><pubDate>Fri, 30 Jan 2009 02:03:00 GMT</pubDate><guid>http://blogs.wankuma.com/katamari/archive/2009/01/30/167142.aspx</guid><wfw:comment>http://blogs.wankuma.com/katamari/comments/167142.aspx</wfw:comment><comments>http://blogs.wankuma.com/katamari/archive/2009/01/30/167142.aspx#Feedback</comments><slash:comments>296</slash:comments><wfw:commentRss>http://blogs.wankuma.com/katamari/comments/commentRss/167142.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/katamari/services/trackbacks/167142.aspx</trackback:ping><description>&lt;p&gt;　続 WPF Toolkit DataGrid。前回 &lt;a href="http://blogs.wankuma.com/katamari/archive/2009/01/30/167138.aspx"&gt;WPF Toolkit ListViewとしてのDataGrid&lt;/a&gt;&lt;/p&gt; &lt;p&gt;　まぁ、普通 ListViewとして使う場合、右クリックメニューとダブルクリック処理はいるよねーってことで調べてみると、どっちもCodePlexのDiscussionsに似たようなことが書いてありました。&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://www.codeplex.com/wpf/Thread/View.aspx?ThreadId=41195"&gt;Handling DataGrid column header right mouse button click&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://www.codeplex.com/wpf/Thread/View.aspx?ThreadId=38919"&gt;Datagrid: ContextMenu for Column and Row Headers&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;　クリックしたときの行を取得するにはListViewと同じような感じかな？　あまりスマートじゃない。&lt;/p&gt; &lt;p&gt;　ContextMenuは、DataGridのContextMenuに書いてしまうと、行の上でもスクロールバーの上でもメニューが出てしまうのでStyleを使って書けば良いみたい。&lt;/p&gt; &lt;p&gt; &lt;div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:09820578-c495-4616-95df-b6f6659b620d" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;Window.Resources&amp;gt;
    &amp;lt;ContextMenu x:Key="ColumnHeaderContextMenu"&amp;gt;
        &amp;lt;MenuItem Header="Foo" /&amp;gt;
    &amp;lt;/ContextMenu&amp;gt;
    &amp;lt;ContextMenu x:Key="RowContextMenu"&amp;gt;
        &amp;lt;MenuItem Header="Bar" /&amp;gt;
    &amp;lt;/ContextMenu&amp;gt;

    &amp;lt;Style x:Key="DefaultCellStyle" TargetType="{x:Type dg:DataGridCell}"&amp;gt;
        &amp;lt;Setter Property="BorderThickness" Value="0" /&amp;gt;
    &amp;lt;/Style&amp;gt;
    &amp;lt;Style x:Key="DefaultColumnHeaderStyle" TargetType="{x:Type dg:DataGridColumnHeader}"&amp;gt;
        &amp;lt;Setter Property="ContextMenu" Value="{StaticResource ColumnHeaderContextMenu}" /&amp;gt;
    &amp;lt;/Style&amp;gt;
    &amp;lt;Style x:Key="DefaultRowStyle" TargetType="{x:Type dg:DataGridRow}"&amp;gt;
        &amp;lt;Setter Property="ContextMenu" Value="{StaticResource RowContextMenu}" /&amp;gt;
    &amp;lt;/Style&amp;gt;
&amp;lt;/Window.Resources&amp;gt;
&amp;lt;Grid&amp;gt;
    &amp;lt;dg:DataGrid
        x:Name="DataGrid"
        AutoGenerateColumns="False"
        GridLinesVisibility="None"
        HeadersVisibility="Column"
        IsReadOnly="True"
        SelectionUnit="FullRow"
        CellStyle="{StaticResource DefaultCellStyle}"
        ItemsSource="{Binding Path=Persons}"
        ColumnHeaderStyle="{StaticResource DefaultColumnHeaderStyle}"
        RowStyle="{StaticResource DefaultRowStyle}"
        MouseDoubleClick="DataGird_MouseDoubleClick"&amp;gt;
        &amp;lt;dg:DataGrid.Columns&amp;gt;
            &amp;lt;dg:DataGridTextColumn Header="名前" 
                                   Binding="{Binding Path=Name}"
                                   Visibility="Visible"/&amp;gt;
            &amp;lt;dg:DataGridTextColumn Header="年齢" 
                                   Binding="{Binding Path=Age}" /&amp;gt;
        &amp;lt;/dg:DataGrid.Columns&amp;gt;                                   
    &amp;lt;/dg:DataGrid&amp;gt;
&amp;lt;/Grid&amp;gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:bcde03d2-52f3-4ce3-add8-84574f33d07c" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="vb"&gt;Private Sub DataGird_MouseDoubleClick(ByVal sender As System.Object, ByVal e As System.Windows.Input.MouseButtonEventArgs)
    Dim d = DirectCast(e.OriginalSource, DependencyObject)
    Do While d IsNot Nothing AndAlso _
        Not TypeOf d Is DataGridCell AndAlso _
        Not TypeOf d Is DataGridColumnHeader
        d = VisualTreeHelper.GetParent(d)
    Loop
    If d Is Nothing Then
        Exit Sub
    ElseIf TypeOf d Is DataGridColumnHeader Then
        ' DataGridColumnHeader !
    ElseIf TypeOf d Is DataGridCell Then
        ' DataGridCell !
    End If
End Sub
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;　DataGridのColumnHeaderStyleとRowStyleとMouseDoubleClickのところに注目です。列ヘッダの右クリックメニューで、チェックボックス付きのメニューを表示して、列の表示・非表示設定を行いたいけど、それはどうすれば良いのかな。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/katamari/aggbug/167142.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>ＪＺ５ &lt;jz5@katamari.jp&gt;</dc:creator><title>WPF Toolkit ListViewとしてのDataGrid</title><link>http://blogs.wankuma.com/katamari/archive/2009/01/30/167138.aspx</link><pubDate>Fri, 30 Jan 2009 00:50:00 GMT</pubDate><guid>http://blogs.wankuma.com/katamari/archive/2009/01/30/167138.aspx</guid><wfw:comment>http://blogs.wankuma.com/katamari/comments/167138.aspx</wfw:comment><comments>http://blogs.wankuma.com/katamari/archive/2009/01/30/167138.aspx#Feedback</comments><slash:comments>280</slash:comments><wfw:commentRss>http://blogs.wankuma.com/katamari/comments/commentRss/167138.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/katamari/services/trackbacks/167138.aspx</trackback:ping><description>&lt;p&gt;　最近、WPFのListViewをいじっているんですが、ソート機能は &lt;a href="http://frog.raindrop.jp/knowledge/archives/002240.html"&gt;A Sortable GridView (I mean ListView) Control in WPF(翻訳中):.knowledge - frog.raindrop.jp&lt;/a&gt; を参考にそれなりのものができたのだけど、ヘッダをドラッグ＆ドロップで入れ替えた際にそれを保存してアプリを起動時に再現する方法が全然わからない。&lt;/p&gt; &lt;p&gt;　というわけで、&lt;a href="http://www.codeplex.com/wpf/Release/ProjectReleases.aspx?ReleaseId=15598"&gt;Windows Presentation Foundation (WPF) - Release: WPF Toolkit - October 2008 Release&lt;/a&gt; のDataGridを試してみました。きっかけはtech days 2009を見て。あくまでListViewらしく見た目を変えます。&lt;/p&gt; &lt;p&gt;　こんな風にXAMLを書きます。選択範囲をRow単位にしてもどのセルを選択しているかわかってしまうのでセルのStyleを変えてます。&lt;/p&gt; &lt;p&gt; &lt;div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:cdb9bd85-ea73-4746-84be-74fc0cf1b2db" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;Window.Resources&amp;gt;
    &amp;lt;Style x:Key="DefaultCellStyle" TargetType="{x:Type dg:DataGridCell}"&amp;gt;
        &amp;lt;Setter Property="BorderThickness" Value="0" /&amp;gt;
    &amp;lt;/Style&amp;gt;
&amp;lt;/Window.Resources&amp;gt;
&amp;lt;Grid&amp;gt;
    &amp;lt;dg:DataGrid
        x:Name="DataGrid"
        AutoGenerateColumns="False"
        GridLinesVisibility="None"
        HeadersVisibility="Column"
        IsReadOnly="True"
        SelectionUnit="FullRow"
        CellStyle="{StaticResource DefaultCellStyle}"
        ItemsSource="{Binding Path=Persons}"&amp;gt;
        &amp;lt;dg:DataGrid.Columns&amp;gt;
            &amp;lt;dg:DataGridTextColumn Header="名前" 
                                   Binding="{Binding Path=Name}" /&amp;gt;
            &amp;lt;dg:DataGridTextColumn Header="年齢" 
                                   Binding="{Binding Path=Age}" /&amp;gt;
        &amp;lt;/dg:DataGrid.Columns&amp;gt;                                   
    &amp;lt;/dg:DataGrid&amp;gt;
&amp;lt;/Grid&amp;gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;　結果、こんな感じ。良いですねー。デフォルトでソート機能も付いてます。ソート機能をヘッダに持たせたくない場合は、DataGrid***ColumnのCanUserSortプロパティをFalseにします。すると、ヘッダがボタンのように押下できなくなります。すんばらしー。&lt;/p&gt;
&lt;p&gt;&lt;img title="Window1" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="332" alt="Window1" src="http://katamari.wankuma.com/images/WPFToolkitListViewDataGrid_BB6/Window13.png" width="332" border="0"&gt; &lt;/p&gt;
&lt;p&gt;　さて、DataGird***Columnには、DisplayIndexというプロパティを持っていて、XAMLで書いた順番とは別に、表示順が管理されています。これで指定した順番で列を表示できるし、取得も可能。これで解決です！&lt;/p&gt;
&lt;div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:233d5f00-6826-434a-a068-feee40238ade" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="vb"&gt;DataGrid.Columns(0).DisplayIndex = 1&lt;/pre&gt;&lt;/div&gt;&lt;img src ="http://blogs.wankuma.com/katamari/aggbug/167138.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>ＪＺ５ &lt;jz5@katamari.jp&gt;</dc:creator><title>FirePropertyChanged と Microsoft.Design</title><link>http://blogs.wankuma.com/katamari/archive/2009/01/30/167134.aspx</link><pubDate>Fri, 30 Jan 2009 00:04:00 GMT</pubDate><guid>http://blogs.wankuma.com/katamari/archive/2009/01/30/167134.aspx</guid><wfw:comment>http://blogs.wankuma.com/katamari/comments/167134.aspx</wfw:comment><comments>http://blogs.wankuma.com/katamari/archive/2009/01/30/167134.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.wankuma.com/katamari/comments/commentRss/167134.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/katamari/services/trackbacks/167134.aspx</trackback:ping><description>&lt;p&gt;ネタ元： &lt;a href="http://blogs.wankuma.com/naka/archive/2009/01/28/166955.aspx"&gt;NotifyPropertyChangedBase&lt;/a&gt;&lt;/p&gt; &lt;p&gt;　私は中さんのコードを参考にしてWPFを始めたので、この FirePropertyChanged メソッドが私のコードの中にはでてきます。ただし、VB.NETのコードですが。あとベースクラスとしても作っていませんね。&lt;/p&gt; &lt;p&gt;　ほとんどの人が気にしていないことだろうけども、このFireなんちゃらというメソッドは、「&lt;a href="http://msdn.microsoft.com/ja-jp/library/ms182177.aspx"&gt;適切な場合にはイベントを使用します&lt;/a&gt;」にひっかかるんですよねぇ。Fire、AddOn、RemoveOn、Raiseはイベントに使用されるってことなんだけど、動詞だしメソッドじゃないのと思うのですがどうなんでしょう。イベントは過去分詞のイメージがあるけど Clicked じゃなくて Click と書くよね。悩ましい。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/katamari/aggbug/167134.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>