同一型のUI同士でならバインディングできた。が、こんな用途はないだろう。もっと実際のユースケースに沿った実例が欲しい。探しても見つからない。
成果物
対象環境
- Raspbierry pi 3 Model B+
- Raspbian stretch(9.0) 2018-06-27
- Mono 5.16.0
- MonoDevelop 7.6 build 711
- Eto.Forms 2.4.1 拡張機能, NuGetパッケージ
前回
- http://ytyaru.hatenablog.com/entry/2020/01/30/000000
- http://ytyaru.hatenablog.com/entry/2020/01/29/000000
- http://ytyaru.hatenablog.com/entry/2020/01/28/000000
- http://ytyaru.hatenablog.com/entry/2020/01/27/000000
- http://ytyaru.hatenablog.com/entry/2020/01/26/000000
- http://ytyaru.hatenablog.com/entry/2020/01/25/000000
- http://ytyaru.hatenablog.com/entry/2020/01/24/000000
手順
- プロジェクト作成
- TextBox追加
- 実行
1. プロジェクト作成
- メニュー→
ファイル
→新しいソリューション
マルチプラットフォーム
→アプリ
→Eto Application
- 名前などを適当に入力し、
Xaml
を選択する
場所
を入力する
- プロジェクトが作成される
2. TextBox追加
- Xamlファイルを開く(MainForm.xeto)
<TextBox x:Name="textBox1" Text="https://www.google.co.jp" Width="800" KeyDown="HandleInputUrl" />
を追記する- csファイルを開く(MainForm.xeto.cs)
HandleInputUrl
メソッドを追加する
ソースコード抜粋
MainForm.xeto
空っぽにする。データバインディングはC#でしか実装できないので、それに引きづられてすべてC#で実装することになる。XAMLとは一体……。MVVMとは一体……。全然M,V,Cが分離できてなくね?
<?xml version="1.0" encoding="UTF-8"?> <Form xmlns="http://schema.picoe.ca/eto.forms" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="My Eto Form" ClientSize="400, 350" Padding="10"> <StackLayout> </StackLayout> </Form> `````` #### UrlModel.cs TextBoxのモデルクラスを作る。これが問題の`INotifyPropertyChanged`を継承した超面倒なやつ。
using System; using System.ComponentModel; // INotifyPropertyChanged using System.Runtime.CompilerServices; // CallerMemberName
namespace HelloXamlBinding
{
public class UrlModel : INotifyPropertyChanged
{
string url;
public string Url { get { return url; } set { this.url = value; OnPropertyChanged(); } }
void OnPropertyChanged([CallerMemberName] string memberName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(memberName));
}
public event PropertyChangedEventHandler PropertyChanged;
}
}
たかが文字列ひとつでこのコード量。本質的でない内容。これイベント駆動式よりひどくないか? #### MainForm.xeto.cs XAMLで追加した`HandleInputUrl`メソッドを実装する。
using System; using System.Collections.Generic; using Eto.Forms; using Eto.Drawing; using Eto.Serialization.Xaml;
namespace HelloXamlBinding { public class MainForm : Form { public MainForm() { XamlReader.Load(this); Create(); } private void Create() { var textBox = new TextBox(); textBox.TextBinding.BindDataContext((UrlModel m) => m.Url); Content = textBox; var model = new UrlModel { Url = "https://www.yahoo.co.jp" }; DataContext = model; } } }
TextBoxの生成、バインディング、Windowへの追加。単に初期値を設定するだけなので、わざわざデータ・バインディングを使うメリットもないコード。 ## 3. 実行 1. Ctrl+F5で実行 1. 怒られた [f:id:ytyaru:20181202084218p:plain] 1. ファイルパスを辿ってexeファイルを直接叩くと実行できた [f:id:ytyaru:20181204080023p:plain] # 所感 これをWebViewと連動させて、入力したURLを表示させたい。そのためには、KeyDownイベントとWebViewへの値セットが必要。次回以降、順にやってみる。