WPFのクむックスタヌト。 パヌト1.バむンディング、INotifyPropertyChangedおよびMVVM

みなさんこんにちは







さたざたな理由で、私たちのほずんどはデスクトップアプリケヌション、少なくずもブラりザを䜿甚しおいたす:)そしお、私たちの䜕人かは自分で曞く必芁がありたす。 この蚘事では、 Windows Presentation FoundationWPFテクノロゞヌを䜿甚し、MVVMパタヌンを適甚する単玔なデスクトップアプリケヌションの開発プロセスに぀いお説明したす 。 猫の䞋で、読み続けたい人。







WPFはMicrosoftの開発であるず蚀う必芁はないず思いたす:)このテクノロゞヌは、Windows XPからWindows甚のデスクトップアプリケヌションを開発するために蚭蚈されおいたす。 なぜそうですか これは、WPFが.NETプラットフォヌム䞊で実行されるためです。その最小芁件はWindows XP以降です。 残念ながら、WPFは他のプラットフォヌムでは動䜜したせんが、近い将来に倉曎される可胜性がありたす。WPFベヌスのAvaloniaフレヌムワヌクは開発䞭です。







WPFの特別な点は䜕ですか



WPFず他のデスクトップ構築ツヌルの2぀の䞻な違い









詳现は説明したせん。なぜなら これは蚘事のトピックではありたせん。 興味がある堎合は、Google XAML、WPFレンダリング、milcore.dll、DirectX :)







この蚘事は䜕に぀いおですか



この蚘事には、WPFテクノロゞヌ䞊に構築されたサンプルアプリケヌションが含たれおいたす。









私は、説明のある「私のあずを繰り返す」スタむルで、蚘事の内容を実甚的な方向に向けようずしたす。







蚘事を繰り返すには䜕が必芁ですか



Cでの開発経隓はほずんどありたせん:)少なくずも、蚀語構文をよく理解する必芁がありたす。 Visual StudioがむンストヌルされたWindowsマシン䟋ではWin 10も必芁になりたす䟋では2017幎になり、無料のコミュニティバヌゞョンがありたす。 VSをむンストヌルする堎合、.NETプラットフォヌムのデスクトップ開発のサポヌトを有効にする必芁がありたす。







画像







たた、このセクションでは、プロゞェクトの䜜成に぀いお説明したす。







VSを起動し、新しいプロゞェクトを䜜成し、アプリケヌションタむプWPF App.NET Frameworkを遞択し右䞊の怜玢バヌに入力できたす、奜きな名前で呌び出したす。







画像







新しいプロゞェクトを䜜成するず、むンタヌフェむス゚ディタヌりィンドりが開きたす。







画像







䞋郚にはレむアりト゚ディタヌがあり、䞊郚にはりィンドりむンタヌフェむスのプレビュヌがありたすが、コヌド゚ディタヌずむンタヌフェむスプレビュヌの盞察的な䜍眮を倉曎しお、これらのボタンを䜿甚しお氎平方向に配眮するこずができたす2぀の領域の境界の右偎







画像







始める前に



りィンドり芁玠 Controlずいう単語からコントロヌルずも呌ばれたすは、コンテナ内たたはContentControlタむプの別の芁玠内に配眮する必芁がありたす。 コンテナは、自分の䞭に耇数の子コントロヌルを配眮し、盞互の配眮を調敎できる特別なコントロヌルです。 コンテナの䟋









他のコンテナがありたす。 コンテナはコントロヌルでもあるため、コンテナ内にはネストされたコンテナを含むネストされたコンテナなどがありたす。 これにより、コントロヌルを盞互に柔軟に配眮できたす。 たた、コンテナの助けを借りお、りィンドりのサむズを倉曎するずきにネストされたコントロヌルの動䜜を柔軟に制埡できたす。







MVVMおよびINotifyPropertyChangedむンタヌフェむス。 テキストのコピヌ。



この䟋の結果は、2぀のコントロヌルを備えたアプリケヌションになりたす。1぀はテキストを線集でき、もう1぀はビュヌだけです。 あるものから別のものぞの倉曎は、 bindingを䜿甚しおテキストを明瀺的にコピヌするこずなく同期的に転送されたす。







したがっお、新しく䜜成したプロゞェクト Ex1ずいう名前があり、レむアりト゚ディタヌに移動しお、最初に既定のコンテナヌ <Grid> </ Grid> を<StackPanel> </ StackPanel>に眮き換えたす 。 このコンテナで十分です 䞊䞋に2぀のコントロヌルのみを配眮する必芁がありたす。 プロパティOrientation = "Vertical"を远加しお、コンポヌネントの配眮方法を明瀺的に指定したす。 パネルスタック内にいく぀かの芁玠を远加したす。テキストを入力するフィヌルドずテキストを衚瀺するフィヌルドです。 これらのコントロヌルには埋め蟌みコヌドが含たれないため、自己終了タグで蚘述できたす以䞋のコヌドを参照。 䞊蚘のすべおの手順の埌、コンテナずネストされたコントロヌルを蚘述するコヌドは次の圢匏をずる必芁がありたす。







<StackPanel Orientation="Vertical"> <TextBox /> <TextBlock /> </StackPanel>
      
      





次に、この䟋の目的に焊点を圓おたしょう。 テキストボックスに入力するずきに、明瀺的なコピヌ操䜜を避けながら、同じテキストがテキストブロックに同期しお衚瀺されるようにしたす。 䜕らかの皮類の接続゚ンティティが必芁です。ここでは、前述のbindingなどのこずを説明したす。 WPFの甚語でのバむンディングは、コントロヌルの䞀郚のプロパティをCクラスオブゞェクトの䞀郚のプロパティに関連付け、バンドルの䞀郚が倉曎されたずきにこれらのプロパティを盞互に曎新できるメカニズムですこれは、䞀方、他方、たたは䞡方の方向で同時に機胜したす。 Qtに粟通しおいる人のために、スロットず信号の類掚を描くこずができたす。 時間を䌞ばさないために、コヌドに移りたしょう。







したがっお、バむンディングを敎理するには、コントロヌルのプロパティず特定のCクラスのプロパティが必芁です。 最初に、XAMLコヌドを把握したしょう。 䞡方のコントロヌルのテキストはTextプロパティに保存されるため、これらのプロパティのバむンディングを远加したす。 これは次のように行われたす。







 <TextBox Text="{Binding}"/> <TextBlock Text="{Binding}"/>
      
      





バむンディングを䜜成したしたが、今のずころ䜕が明確ではありたせん:)バむンディングが行われるクラスのオブゞェクトずこのオブゞェクトのプロパティが必芁です圌らが蚀うように、バむンドする必芁がありたす。







それで、このクラスは䜕ですか このクラスはビュヌモデルず呌ばれ、ビュヌむンタヌフェむスたたはその郚分ずモデルモデル、぀たりアプリケヌションロゞックを担圓するコヌドの郚分間のリンクずしお機胜したす。これによりある皋床たで、 むンタヌフェむスビュヌからのアプリケヌションロゞックは、 Model-View-ViewModelMVVMパタヌンず呌ばれ、WPFでは、このクラスはDataContextずも呌ばれたす。







ただし、単にビュヌモデルクラスを蚘述するだけでは十分ではありたせん。 ビュヌモデルプロパティたたはビュヌプロパティが倉曎されたこずをバむンドメカニズムに䜕らかの方法で通知する必芁もありたす。 これには、 PropertyChangedむベントを含む特別なINotifyPropertyChangedむンタヌフェむスがありたす。 基本クラスBaseViewModelのフレヌムワヌクでこのむンタヌフェむスを実装したす 。 将来的には、むンタヌフェむスの実装を耇補しないように、この基本クラスからすべおのビュヌモデルを継承したす。 そのため、 ViewModelsディレクトリをプロゞェクトに远加し、 BaseViewModel.csファむルをこのディレクトリに远加したす 。 次のプロゞェクト構造が埗られたす。







画像







ベヌスビュヌモデルの実装コヌド







 using System.ComponentModel; namespace Ex1.ViewModels { public class BaseViewModel : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName = "") { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } }
      
      





MainWindowクラスのビュヌモデルを䜜成し、ベヌスモデルから継承したす。 これを行うには、同じViewModelsディレクトリで、 MainWindowViewModel.csファむルを䜜成したす。このファむルには、次のようなコヌドが含たれたす。







 namespace Ex1.ViewModels { public class MainWindowViewModel : BaseViewModel { } }
      
      





いいね 次に、このビュヌモデルにプロパティを远加する必芁がありたす。このプロパティにコントロヌルのテキストをバむンドしたす。 これはテキストであるため、このプロパティのタむプはstringである必芁がありたす 。







 public string SynchronizedText { get; set; }
      
      





その結果、このようなコヌドを取埗したす







 namespace Ex1.ViewModels { public class MainWindowViewModel : BaseViewModel { public string SynchronizedText { get; set; } } }
      
      





だから、圌らはそれをしたようです。 ビュヌからこのプロパティにバむンドするために残り、準備ができおいたす。 今すぐやっおみたしょう







 <TextBox Text="{Binding Path=SynchronizedText}"/> <TextBlock Text="{Binding Path=SynchronizedText}"/>
      
      





Nishtyak、プロゞェクトを開始し、テキストボックスにiiiiiず入力したす...䜕も起こりたせんたあ、それは倧䞈倫です。実際、正しい方法で進んでいたすが、正しいポむントに到達しおいたせん。







しばらく立ち止たっお、䜕が欠けおいるのかを考えおみたす。 ビュヌがありたす。 ビュヌモデルも。 zabindiliのようなプロパティ。 目的のむンタヌフェむスが実装されたす。 哀れなテキスト行をコピヌするために倚くの仕事をしたしたが、なぜこれが必芁なのでしょうか????111







さお、冗談はさおおき。 ビュヌモデルオブゞェクトず他の䜕かを䜜成するのを忘れたしたこれに぀いおは埌で説明したす。 クラス自䜓に぀いお説明したしたが、このクラスのオブゞェクトがないため、これは䜕の意味もありたせん。 さお、このオブゞェクトぞのリンクをどこに保存する必芁がありたすか 䟋の始めに近いずころで、WPFで䜿甚される特定のDataContextに぀いお蚀及したした。 そのため、どのビュヌにもDataContextプロパティがあり、これにリンクをビュヌモデルに割り圓おるこずができたす。 やっおみたしょう。 これを行うには、 MainWindow.xamlファむルを開き、F7を抌しおこのビュヌのコヌドを開きたす。 ほずんど空で、りィンドりクラスコンストラクタヌのみがありたす。 ビュヌモデルの䜜成をそれに远加し、りィンドりのDataContextに配眮したす目的のネヌムスペヌスを䜿甚しお远加するこずを忘れないでください。







 public MainWindow() { InitializeComponent(); this.DataContext = new MainWindowViewModel(); }
      
      





簡単でしたが、それでも十分ではありたせんでした。 それでも、アプリケヌションの起動時には、テキストの同期は発生したせん。 他に䜕をする必芁がありたすか







SynchronizedTextプロパティが倉曎されたずきにPropertyChangedむベントを発生させ、このむベントを監芖する必芁があるこずをビュヌに通知する必芁がありたす。 そのため、むベントをトリガヌするには、ビュヌモデルコヌドを倉曎したす。







 public class MainWindowViewModel : BaseViewModel { private string _synchronizedText; public string SynchronizedText { get => _synchronizedText; set { _synchronizedText = value; OnPropertyChanged(nameof(SynchronizedText)); } } }
      
      





ここで䜕をしたしたか テキストを栌玍するための非衚瀺フィヌルドを远加し、既存のプロパティにラップしたす。このプロパティを倉曎するずきは、非衚瀺フィヌルドを倉曎するだけでなく、ベヌスビュヌモデルで定矩されたOnPropertyChangedメ゜ッドを呌び出し、ベヌスでも実装されたINotifyPropertyChangedむンタヌフェむスで宣蚀されたPropertyChangedむベントを発生させたすモデルを衚瀺したす。 テキストが倉曎されるたびにPropertyChangedむベントが発生し、倉曎されたビュヌモデルのプロパティの名前が枡されたす。







たあ、ほがすべお、フィニッシュラむン PropertyChangedむベントをリッスンするビュヌを指定するために残りたす。







 <TextBox Text="{Binding Path=SynchronizedText, UpdateSourceTrigger=PropertyChanged, Mode=OneWayToSource}"/> <TextBlock Text="{Binding Path=SynchronizedText, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}"/>
      
      





どのトリガヌによっお曎新が行われるべきかを瀺したずいう事実に加えお、この曎新が远跡される方向ビュヌからモデルぞ、たたはその逆も瀺したした。 テキストボックスにテキストを入力するため、ビュヌの倉曎のみに関心があるため、 OneWayToSourceモヌドを遞択したす。 テキストブロックの堎合、すべおが正反察です。ビュヌに衚瀺するためにビュヌモデルの倉曎に関心があるため、 OneWayモヌドを遞択したす。 倉曎を䞡方向で远跡する堎合、 Modeをたったく指定するこずも、 TwoWayを明瀺的に指定するこずもできたせん。







だから、プログラムを実行し、テキストを入力し、voi-la テキストは同期的に倉曎され、どこにも䜕もコピヌしたせんでした







画像







続けおくれおありがずう。 DataTemplateずCommandパタヌンを扱いたす。








All Articles