2018年8月21日火曜日

[WPF]コンボボックスにデータバインド

コンボボックスとのデータバインディングを試してみる

コンボボックスとバインドする

コンボボックスを追加する

データをバインドするためのクラスを作成する。

曜日の列挙型定義する。

曜日Enumと文字列を持つディクショナリを作成し、初期値を設定しておく。

    
class MyDataBind
{
    public enum Week
    {
        Sunday,
        Monday,
        Tuesday,
        Wednesday,
        Thursday,
        Friday,
        Saturday
    }

    public Dictionary WeekList { get; set; } 
        = new Dictionary
    {
        [Week.Sunday] = "日曜日",
        [Week.Monday] = "月曜日",
        [Week.Tuesday] = "火曜日",
        [Week.Wednesday] = "水曜日",
        [Week.Thursday] = "木曜日",
        [Week.Friday] = "金曜日",
        [Week.Saturday] = "土曜日"

    };
}

    

DataContextとバインド用クラスを紐付ける

「新規作成」ボタンをクリックする前に、一度ビルドしておく。先に追加したバインド用クラスをデザイン画面から選択できるようにしたいため。

バインド用クラスを選択する。

自分で追加したクラスを見やすくするため「すべてのアセンブリの表示」はOFFにしておく。

バインドされた。次に、バインド用クラスのディクショナリとコンボボックスを紐付ける

ItemSourceの赤枠クリック

「データバインディングの作成」クリック

バインド用クラスに作成したWeekListディクショナリを選択する。

追加された。一度動かしてみる。

コンボボックスのリストに表示されたが、KeyとValueがまとめて表示されている。

コンボ表示項目の設定

選択される値はディクショナリのKey、リストに表示される値はディクショナリのValueになるようにしてみる。

DisplayMemberPathに「Value」、SelectedValuePathに「Key」と入力する

動かしてみる。

曜日の日本語名(Value部)のみになった。

選択値に曜日Enum(Key部)がセットされるようにする

バインド用クラスにプロパティを追加

SelectedVal コンボボックスの選択値とバインドさせるためのプロパティ

    
public string SelectedVal { get; set; }        
    

コンボボックスのSelectedValueプロパティとバインドさせる。

赤枠クリック(クリック前にビルドを忘れずに)

データバインディングの作成クリック

先ほど追加したSelectedValを選択

確認のため、コンボボックスのイベントハンドラ追加

コンボの選択が変わったときに、その選択値をメッセージボックスで表示する。

    
private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    MessageBox.Show((this.DataContext as MyDataBind).SelectedVal);
}
    

動かしてみる

月曜日を選択

OK

木曜日を選択

これもOK。

2018年8月20日月曜日

[WPF]データバインド初歩~変更検知

WPFのデータバインディングと、バインドしたコントロールのプロパティ変更を検知できるよう作ってみる。

テキストボックスとバインディングしてみる

WPFの新規プロジェクトを作り、メイン画面にテキストボックスとボタンを適当に追加。

クラスMyDataBindを追加。テキストボックスのTextプロパティにバインドするためのクラス。

    
class MyDataBind
{
    public string TextData { get; set; } = "しょきちです。";
}
    

作成したバインド用クラスを、メイン画面のDataContextプロパティに登録する。

メイン画面のDataContextプロパティで「新規作成」クリック(クリック前にいちど、ビルドしておく)

さきほど作成したMyDataBindを選択

選択後

DataContextに紐付けられた。

テキストボックスのTextプロパティにバインドする。

テキストボックスのTextプロパティの赤枠をクリック

データバインディングの作成をクリック

DataContextに紐付けたMyDataBindが表示される。そのTextDataプロパティを選択する。

Textプロパティにバインドされ、初期値が表示された。

実行してみる。テキストボックスにMyDataBindで設定した初期値が表示された。

テキストの変更を検知できるようにする

ボタンをクリックしたときにテキストの内容を変更するよう作ってみる。

ボタンのプロパティからClickイベントを作成する。

ボタンクリックイベントハンドラ

メイン画面にバインドしたDataContextのTextDataに、現在時刻を設定してみる。ボタンをクリックするたびに、現在時刻がテキストボックスに表示されるようにしたい。

    
private void Button_Click(object sender, RoutedEventArgs e)
{
    (this.DataContext as MyDataBind).TextData = DateTime.Now.ToLongTimeString();
}
    

実行してみる。

ボタンをクリック

・・・しても、一切変わらない。

テキストの内容を検知するためには、バインドクラス側でイベントを実装してやる必要がある。

    
using System.ComponentModel;

namespace WpfApp1
{
    // INotifyPropertyChangedインターフェースを実装する。
    class MyDataBind : INotifyPropertyChanged
    {
        // インターフェースを実装すると、イベントの実装が強制される
        public event PropertyChangedEventHandler PropertyChanged;

        // プロパティ内でイベントを発動させるので、自動実装プロパティじゃそぐわない
        // public string TextData { get; set; } = "しょきちです。";

        // プロパティを作り直す。
        private string textData = "しょきちです。改";
        public string TextData
        {
            get
            {
                return this.textData;
            }

            set
            {
                this.textData = value;

                // ここでイベントを発動させる。
                // valueと比較し値が変わったときだけ起動させてもいいかもしれない。
                this.OnPropertyChanbed("TextData");
            }
        }

        // プロパティ値変更時にイベントを発動させるメソッド
        private void OnPropertyChanbed(string propertyName)
        {
            this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}
    

試してみる。ボタンクリック

時刻がテキストボックスにセットされた。もう一度クリック。

変更された。OKそう。

2018年8月17日金曜日

[VSCode]拡張機能の場所

ここのボタンをクリックすると

拡張機能を検索できる。

2018年8月10日金曜日

[Excel]HYPERLINK関数のリンク先が行挿入された場合に対応する


HYPERLINK関数で直接指定する

HYPERLINK関数でリンク先のセルを直接指定するとリンク先が行挿入された場合にずれてしまう。

直接指定した場合。シート2の「A10」セルを指定




=HYPERLINK("#Sheet2!A10","直指定")

ジャンプしてみる。




最初のジャンプはOK

行挿入してしまうと




次のジャンプはリンクしたいところからズレてしまう。




CELL関数を駆使してみる

CELL関数でアドレス情報を取得し、そのアドレス情報をHYPERLINKのリンク先にする。




=CELL("address",Sheet2!A10)

リンク先であるシート2セルA10のアドレス情報を取得する。

=HYPERLINK(CELL("address",Sheet2!A10),"CELL関数で位置指定")

そのセルアドレス情報をリンク先として、HYPERLINK関数を作成する。

ジャンプする。




行挿入前のジャンプはOK

2行の行挿入をしてみる




CELL関数の参照セルを見ると、挿入後のセルA12に変わっている。




再びジャンプ。




HYPERLINK関数でリンク先にジャンプすると、行がズレずにジャンプできた。

[WPF]コンボボックスにデータバインド

コンボボックスとのデータバインディングを試してみる コンボボックスとバインドする コンボ表示項目の設定 選択値に曜日Enum(Key部)がセットされるようにする ...