中年プログラマーの息抜き

カシマルです。 最近、新しい土地へ引っ越しをしたのですが、これを機に何か始めたいなと思ってブログをはじめました。気の向くままに更新していきます。

WPF双方向データバインディング  INotifyPropertyChangedとメソッド置換で遊んでみた

f:id:tm-b:20200929012602j:plain

 

はじめに

INotifyPropertyChangedとメソッドを動的に置き換えて遊んでみました。業務でこんなことすると怒られます。というか動作保証できないし(汗) シュミで遊ぶときはこんな部品があっても良いかな。。。(最適化すると動かないけど)

 

INotifyPropertyChangedを実装する方法

単に何も考えず実装するとこんな感じかな。

・ViewModelプロパティ定義

 private string bindText1 = "";
 public string BindText1 {
      get { return this.bindText1; }
      set {
          this.bindText1 = value;
          NotifyPropertyChanged();
      }
 }

趣味プロで実装するとこんな感じかな(笑)
・ViewModelプロパティ定義

 public string BindText1 { get; set; }

・ViewModelクラスの親クラス

まとめ

好きこそものの上手なれ。 やればできそう、というようなことも会話で役に立つかもしれませんし、時間を見つけていろいろ遊んでみたいと思いますー

 

Joke-INotifyPropertyChanged-Implementが間違ってました。動くもので修正

プログラムでモデルとクエリ結果をJOINしてみた

はじめに

SQLが書けない環境でJOINを共通的に使えるようにするために

プログラム

private static <T, D extends Cloneable> void join(boolean p1, List<D> p2, Map<String, List<T>> p3, Function<D, String> p4, Map<String, BiConsumer<D, T>> p5) throws CloneNotSupportedException {
     for (int i = 0; i < p2.size(); i++) {
         String key = p4.apply(p2.get(i));
         if (p3.containsKey(key)) {
             if (p5!= null)
                 p5.get(key).accept(p2.get(i), p3.get(key).get(0));
             for (int n = 1; n < p3.get(key).size(); n++) {
                 D clone = CloneUtils.cloneObject(p2.get(i));
                  if (p5!= null)
                      p5.get(key).accept(clone, p3.get(key).get(n));
                  p2.add(i++, clone);
             }
         } else if (p1) {
             p2.remove(i--);
         } else {

                  if (p5!= null)
                      p5.get(key).accept(clone, p3.get(key).get(n)); //nullを設定できれば

         }
     }
}

利用例

List<・・・> ‘daoList;//結合したいデータ

List<Cloneable> ‘dtoList;//結合されるソース

・・・

Function<daoモデル, String> key1 = m -> ・・・;//結合キーの左

Function<dtoモデル, String> key2 = m -> ・・・;//結合キーの右

join(true, dtoList, daoList.stream().collect(Collectors.groupingBy( key1 )), key2 , daoList.stream().collect(Collectors.toMap(key1 , m -> setter, (m1, m2) -> m1)));

ひとこと

SQL書かないでね・という開発ではORMを調べるのも大変になりますが、それよりも仕様理解に充てる時間を増やしたいときはこんな感じで進めていくのも一案。