PCだい「ちゅき」

気がつけば庶事手伝い

目次

Blog 利用状況

ニュース

・H24/01/02
 Microsoft MVPを受賞しました
・H23/11/18
 MCTの憂鬱さんと相互リンクを張っていただきました^^
・H23/09/10
 プログラミング生放送でスピーカーさせていただきました^^ ・H22/12/18
 わんくま同盟でスピーカしました^^
さて、来年はどんな年になるかな。予想が当たるといいなぁ。
・H22/07/17
 わんくま同盟でスピーカしました^^
技術系のセッションは久しぶり。VB! VB!
・H22/03/13
 Tech FieldersでLTのスピーカしました^^
・H21/12/12
 わんくま同盟でスピーカしました^^
最近はずっとLT担当だったので、ちょっと新鮮でした^^
・H20/11/18
 Tech Fielders セミナー 大阪の
 Lightning Talkで優勝しました^^
・H20/8/23
 わんくま同盟で2回目のスピーカしちゃいました
 WCFと戯れてみました^^
・H20/5/17
 わんくま同盟でスピーカしちゃいました^^
 ちゃんとスピーカー持参しましたよんw
・H20/2/22
 なめ猫の参加証もらいました^^
・H20/1/22
 テンプレートを変えてみました^^
・H19/7/23
 ACEプログラムで、ナップサックをもらった上、工具セットももらえることになりました^^
・H19/1/11
 1が並ぶ縁起の良い日に投稿開始!。今後ともお付き合いよろしくお願いします
・H18/10/29
 参加させていただきました^^
ド・初心者ですがどうぞよろしくお願いします。

↓うーん、仕事しろ^^;
Chukiの脳内メーター

Chukiの脳内メーター

書庫

日記カテゴリ

ギャラリ

コミュニティ

相互リンク

【Love VB】 レッツWPF M-V-VM モデル

元ネタ:[WPF][C#]Model View ViewModelパターンでハローワールド
http://blogs.wankuma.com/kazuki/archive/2009/02/23/168586.aspx

ぼくのVBへの愛が試される瞬間。
誰も書いてくれないんだったら自分で書く。(C#の物まねw)

ということで、かずきさんのブログからパクってきました^^;
本家のC#版と比較して、VBへの愛を深めてくださいorz

 


■まずは、DelegateのICommandから。いきなりEventでツンツンお姉さん発見

Imports System
Imports System.Windows.Input
Public Class DelegateCommand : Implements ICommand
    ''' <summary>
    ''' 実行する処理と、実行可能かどうかの判断を   
    ''' delegateで指定可能なコマンドクラス。   
    ''' </summary>
    Private _executeAction As Action(Of Object)
    Private _canExecuteAction As Func(Of Object, Boolean)
    'そういえばコンストラクタの宣言方法がまったく違いましたねw
    Public Sub New(ByVal executeAction As Action(Of Object), _
ByVal canExecuteAction As Func(Of Object, Boolean))
_executeAction = executeAction _canExecuteAction = canExecuteAction End Sub #Region "ICommand の実装" Public Function CanExecute(ByVal parameter As Object) As _
Boolean Implements System.Windows.Input.ICommand.CanExecute Return _canExecuteAction(parameter) End Function 'CommandManagerからイベント発行してもらうようにする。頑張れカスタムイベント 'デフォルトで勝手にイベントを定義してくれる有難迷惑に乾杯^^/ あーーーうざい。さっくりコメントアウト 'Public Event CanExecuteChanged(ByVal sender As Object, ByVal e As System.EventArgs) _
'Implements System.Windows.Input.ICommand.CanExecuteChanged
Private _CanExecuteChanged As EventHandler Public Custom Event CanExecuteChanged As EventHandler _
Implements System.Windows.Input.ICommand.CanExecuteChanged AddHandler(ByVal value As EventHandler) Me._CanExecuteChanged = _
CType(System.Delegate.Combine(Me._CanExecuteChanged, value), EventHandler) AddHandler CommandManager.RequerySuggested, Me._CanExecuteChanged End AddHandler RemoveHandler(ByVal value As EventHandler) Me._CanExecuteChanged = _
CType(System.Delegate.Remove(Me._CanExecuteChanged, value), EventHandler) RemoveHandler CommandManager.RequerySuggested, Me._CanExecuteChanged End RemoveHandler RaiseEvent(ByVal sender As Object, ByVal e As EventArgs) If (Not Me._CanExecuteChanged Is Nothing) Then Me._CanExecuteChanged(sender, e) End If End RaiseEvent End Event
Public Sub Execute(ByVal parameter As Object) _
Implements System.Windows.Input.ICommand.Execute _executeAction(parameter) End Sub #End Region End Class

■Modelの作成

自動プロパティ裏疾しす

Public Class Person
    Private _name As String
    Public Property Name() As String
        Get
            Return _name
        End Get
        Set(ByVal value As String)
            _name = value
        End Set
    End Property
End Class

■ViewModelの作成

もうね、ツンツンツンツン、ハイヒールを履き始めましたよんw

Imports System.ComponentModel
Public Class HelloWorldViewModel : Implements INotifyPropertyChanged, IDataErrorInfo
#Region "コンストラクタと、コンストラクタで初期化するフィールド "
    Private _model As Person
    Public Sub New(ByVal model As Person)
        _model = model
    End Sub
#End Region
#Region "入力・出力用プロパティ"
    ' ModelクラスのNameプロパティの値の取得と設定   
    Public Property Name() As String
        Get
            Return _model.Name
        End Get
        Set(ByVal value As String)
            If _model.Name = value Then Return
            _model.Name = value
            OnPropertyChanged("Name")
        End Set
    End Property
    Private _message As String
    Public Property Message() As String
        Get
            Return _message
        End Get
        Set(ByVal value As String)
            'If _message.Equals(value) Then Return
            _message = value
            OnPropertyChanged("Message")
        End Set
    End Property
#End Region
#Region "コマンド"
    Private _createMessageCommand As ICommand
    Public ReadOnly Property CreateMessageCommand() As ICommand
        Get
            ' 作成済みなら、それを返す   
            If Not IsNothing(_createMessageCommand) Then Return _createMessageCommand
            ' 遅延初期化   
            ' 今回は、処理が単純なのでラムダ式で全部書いたが、通常は   
            ' ViewModel内の別メソッドとして定義する。   
            'VBでもラムダ式で...ぼけ、かす、あほ(やばい、VBへの愛が...
            'Function式なので、なにがしかの戻り値が必要。んでもって...。
            'Me.Message = string.Format("こんにちは{0}さん", Me.Name)
       'ラムダ式では、これは代入じゃなくて比較を意味するんですねこのくそボケは(使えんorz)
            '心の叫び誰か「てめぇの書き方が間違ってる!!」ってdisってぇ(できればメガネ女子)
            _createMessageCommand = New DelegateCommand( _
                AddressOf updateMessage, _
                Function(param) String.IsNullOrEmpty(CType(Me, IDataErrorInfo)("Name")))
            Return _createMessageCommand
        End Get
    End Property
    '諦めてメソッド作りましょうorz
    Private Sub updateMessage()
        Me.Message = String.Format("こんにちは{0}さん", Me.Name)
    End Sub
#End Region
#Region "IDataErrorInfo メンバ"
    Public ReadOnly Property [Error]() As String Implements System.ComponentModel.IDataErrorInfo.Error
        Get
            Return Nothing
        End Get
    End Property
    Default Public ReadOnly Property Item(ByVal columnName As String) As String _
Implements System.ComponentModel.IDataErrorInfo.Item Get Try If columnName = "Name" Then If String.IsNullOrEmpty(Me.Name) Then Return "名前を入力してください" End If End If Return Nothing Finally CommandManager.InvalidateRequerySuggested() End Try End Get End Property #End Region #Region "INotifyPrpertyChangedの実装" Public Event PropertyChanged(ByVal sender As Object, ByVal e As System.ComponentModel.PropertyChangedEventArgs) _
Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged Protected Sub OnPropertyChanged(ByVal name As String) RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(name)) End Sub #End Region End Class

Viewの作成

XAMLもえー。既定の名前空間萌えー

<UserControl x:Class="HelloWorldView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <StackPanel Orientation="Vertical">
        <TextBlock Text="名前:" />
        <!--^Nameプロパティのバインド、即座に変更がViewModelに通知されるようにする -->
        <TextBox Name="textBoxName"    
                 Text="{Binding Name, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}" />
        <!-- あればエラーメッセージを標示する -->
        <TextBlock    
            Text="{Binding ElementName=textBoxName, Path=(Validation.Errors).CurrentItem.ErrorContent}"    
            Foreground="Red"/>
        <Separator />
        <Button Content="Create Message" Command="{Binding CreateMessageCommand}" />
        <TextBlock Text="{Binding Message}" />
    </StackPanel>
</UserControl>  
<Window x:Class="Window1"  
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
    Title="Window1" Height="300" Width="300">
    <Grid>
        <ContentPresenter Content="{Binding}" />
    </Grid>
</Window>  
<Application x:Class="Application"  
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
    xmlns:l="clr-namespace:WPFMVVMHelloWorld"  
    Startup="Application_Startup">
    <Application.Resources>
        <!-- ViewModelとViewの関連付け -->
        <DataTemplate DataType="{x:Type l:HelloWorldViewModel}">
            <l:HelloWorldView />
        </DataTemplate>
    </Application.Resources>
</Application>
 <!-- 2010/1/4 .Resourcesが欠落していたので直しました --> 

■仕上げ

Application.xaml.vb書いて終わり^^

Imports System.Windows
Class Application
    ' Startup、Exit、DispatcherUnhandledException などのアプリケーション レベルのイベントは、
    ' このファイルで処理できます。
    'Application_Startup名前が一緒名だけ。Handlesがついてちゃだめだよん。
    'ついているとXAMLで定義したものと2回呼ばれる><
    Private Sub Application_Startup(ByVal sender As Object, ByVal e As System.Windows.StartupEventArgs)
        Dim objWindow = New Window1()
        objWindow.DataContext = New HelloWorldViewModel(New Person())
        objWindow.Show()
    End Sub
End Class

■結論

VBにはVBの書き方があるの。C#の真似しようとしたらVBちゃんスネちゃった...

#ということで、誰かVBで書く方法教えてくれやがれ下さいorz

 

投稿日時 : 2009年2月24日 21:16

Feedback

# re: 【Love VB】 レッツWPF M-V-VM モデル 2009/02/25 10:03 biac

おつかれさまでした f(^^;

もともと C# より VB.NET のほうが難しい ( 覚えなきゃいけないことが多い ) 言語だと思ってたけど。 匿名デリゲートだの LINQ 式だの、 さらにさらに大変になった感じですねぃw

# …って笑ってるけど。 ぢつは、 お客さんには VB 指定が多いんだよなぁ。 アタマいてぇ。 とくに T社とかw

# re: 【Love VB】 レッツWPF M-V-VM モデル 2009/02/25 11:45 ちゅき

biacさん>コメントありがとうございます。
># …って笑ってるけど。 ぢつは、 お客さんには VB 指定が多いんだよなぁ

うちも... VBでバリバリ書けるようにならないと、なかなかWPFへ本格的に移行しにくいっす><

# re: 【Love VB】 レッツWPF M-V-VM モデル 2009/02/25 15:22 かずき

お~っ私のBlogには断片的なコードしかのってないのに完全再現すごいです!

うちの会社も全体を見回すとVBが多いと思います。
全社の技術的なことの面倒を見るような部署にいるんですが、そこに来るものを見てるとそう感じます。
やっぱ、ぱっと見VBのほうが個人的にしんどいですね(^^;
慣れだけの問題でしょうけど…。

# re: 【Love VB】 レッツWPF M-V-VM モデル 2009/02/25 19:08 ちゅき

>やっぱ、ぱっと見VBのほうが個人的にしんどいですね(^^;

VBが大っきらいなイベントとかデリゲート辺りにWPFのオイシイところがあったりするので、WPFを書くときにはVB Loveとか言いながらC#つこてます^^;

# 【Love VB】 レッツWPF M-V-VM モデル with Visual Basic 2010 (VB10) 2010/01/04 15:10 PCだいちゅき

【Love VB】 レッツWPF M-V-VM モデル with Visual Basic 2010 (VB10)

# 【Love VB】 レッツWPF M-V-VM モデル with Visual Basic 2010 (VB10) 2010/01/06 22:41 PCだいちゅき

【Love VB】 レッツWPF M-V-VM モデル with Visual Basic 2010 (VB10)

# ivermectin 9 mg 2021/09/28 20:49 MarvinLic

ivermectin cream cost https://stromectolfive.com/# stromectol ireland

# ivermectin 3mg tablets 2021/10/31 18:43 DelbertBup

ivermectin 4 tablets price http://stromectolivermectin19.online# ivermectin buy online
ivermectin online

# ivermectin coronavirus 2021/11/01 12:19 DelbertBup

ivermectin 18mg http://stromectolivermectin19.online# ivermectin brand name
ivermectin 90 mg

# ivermectin humans 2021/11/02 15:40 DelbertBup

ivermectin 3mg tablets https://stromectolivermectin19.com/# how much is ivermectin
ivermectin 1

# ivermectin new zealand 2021/11/03 10:53 DelbertBup

buy liquid ivermectin http://stromectolivermectin19.com/# ivermectin 12 mg
ivermectin canada

# sildenafil 20 mg tablet 2021/12/07 1:29 JamesDat

https://iverstrom24.com/# stromectol 3mg tablets

# buy bimatoprost 2021/12/11 22:21 Travislyday

https://baricitinibrx.com/ baricitinib coronavirus

# bimatoprost generic best price 2021/12/13 13:01 Travislyday

https://stromectols.com/ п»?order stromectol online

# careprost bimatoprost for sale https://bimatoprostrx.com
bimatoprost generic
2021/12/13 16:14 Hksfnjkh

careprost bimatoprost for sale https://bimatoprostrx.com
bimatoprost generic

# buy careprost in the usa free shipping 2021/12/15 21:52 Travislyday

http://plaquenils.com/ plaquenil eye exam

# stromectol south africa 2021/12/16 18:46 Eliastib

srxovy https://stromectolr.com stromectol 0.5 mg

# ivermectin 10 mg 2021/12/17 14:17 Eliastib

wpcutr https://stromectolr.com stromectol 3 mg dosage

# п»їorder stromectol online 2021/12/18 16:23 Eliastib

cqbflj https://stromectolr.com ivermectin tablets

# finasterid https://finasteridemen.com/
2022/05/11 23:53 Finasteride

finasterid https://finasteridemen.com/

# lasix online https://buylasix.icu/
lasix dosage 2022/06/25 1:11 LasixRx

lasix online https://buylasix.icu/
lasix dosage

# doors2.txt;1 2023/03/14 16:27 zfLPDbAgYnCc

doors2.txt;1

# Еще одно полезное правило, а именно: дела, неугодные подданным, государи должны возлагать на других, а угодные – исполнять сами. В заключение же повторю, что государю надлежит выказывать к знати почтение, но не вызывать ненависти в народе. Как продавать 2023/03/28 15:01 Еще одно полезное правило, а именно: дела, неугодн

Еще одно полезное правило, а именно: дела,
неугодные подданным, государи должны возлагать на других, а угодные ?
исполнять сами. В заключение же повторю,
что государю надлежит выказывать к знати почтение, но не вызывать ненависти в народе.
Как продавать

# Еще одно полезное правило, а именно: дела, неугодные подданным, государи должны возлагать на других, а угодные – исполнять сами. В заключение же повторю, что государю надлежит выказывать к знати почтение, но не вызывать ненависти в народе. Как продавать 2023/03/28 15:01 Еще одно полезное правило, а именно: дела, неугодн

Еще одно полезное правило, а именно: дела,
неугодные подданным, государи должны возлагать на других, а угодные ?
исполнять сами. В заключение же повторю,
что государю надлежит выказывать к знати почтение, но не вызывать ненависти в народе.
Как продавать

# Еще одно полезное правило, а именно: дела, неугодные подданным, государи должны возлагать на других, а угодные – исполнять сами. В заключение же повторю, что государю надлежит выказывать к знати почтение, но не вызывать ненависти в народе. Как продавать 2023/03/28 15:01 Еще одно полезное правило, а именно: дела, неугодн

Еще одно полезное правило, а именно: дела,
неугодные подданным, государи должны возлагать на других, а угодные ?
исполнять сами. В заключение же повторю,
что государю надлежит выказывать к знати почтение, но не вызывать ненависти в народе.
Как продавать

# Еще одно полезное правило, а именно: дела, неугодные подданным, государи должны возлагать на других, а угодные – исполнять сами. В заключение же повторю, что государю надлежит выказывать к знати почтение, но не вызывать ненависти в народе. Как продавать 2023/03/28 15:02 Еще одно полезное правило, а именно: дела, неугодн

Еще одно полезное правило, а именно: дела,
неугодные подданным, государи должны возлагать на других, а угодные ?
исполнять сами. В заключение же повторю,
что государю надлежит выказывать к знати почтение, но не вызывать ненависти в народе.
Как продавать

# Когда к действию вынуждает необходимость, дерзость оборачивается благоразумием. Как вернуть интерес к жизни в любом возрасте 2023/03/28 17:45 Когда к действию вынуждает необходимость, дерзость

Когда к действию вынуждает необходимость, дерзость
оборачивается благоразумием.
Как вернуть интерес к жизни в
любом возрасте

# Когда к действию вынуждает необходимость, дерзость оборачивается благоразумием. Как вернуть интерес к жизни в любом возрасте 2023/03/28 17:45 Когда к действию вынуждает необходимость, дерзость

Когда к действию вынуждает необходимость, дерзость
оборачивается благоразумием.
Как вернуть интерес к жизни в
любом возрасте

# Когда к действию вынуждает необходимость, дерзость оборачивается благоразумием. Как вернуть интерес к жизни в любом возрасте 2023/03/28 17:45 Когда к действию вынуждает необходимость, дерзость

Когда к действию вынуждает необходимость, дерзость
оборачивается благоразумием.
Как вернуть интерес к жизни в
любом возрасте

# Когда к действию вынуждает необходимость, дерзость оборачивается благоразумием. Как вернуть интерес к жизни в любом возрасте 2023/03/28 17:46 Когда к действию вынуждает необходимость, дерзость

Когда к действию вынуждает необходимость, дерзость
оборачивается благоразумием.
Как вернуть интерес к жизни в
любом возрасте

タイトル
名前
Url
コメント