none
PropertyBinding のバグ? RRS feed

  • 質問

  • お世話になります。

    VisualStudio 2005から、コントロールのプロパティとアプリケーション設定ファイルをバインドできるということを今更知りまして、いろいろといじってみたところ、不可解な挙動に遭遇しました。

    コントロールのVisibleプロパティをバインドすると、設定ファイルの値がプログラム実行時にTrueであれば正常に動くのですが、起動時にFalseだと、データソースの方をTrueに更新してもプロパティに反映されません。

    以下に再現手順を記します。

    1. C# で Windows Form プロジェクトを作ります。
    2. フォームにチェックボックスを1つと、テキストボックスを1つ置きます。
    3. テキストボックスのプロパティの一番上にある(ApplicationSettings)を開き、(PropertyBinding)の右側の...ボタンを押します。
    4. 出てきたダイアログの左側でVisibleを選び、右側のコンボボックスの中にある新規をクリックします。
    5. NameTextBoxVisibleと入力してOKを押します。
    6. 同様にチェックボックスのプロパティでも(PropertyBinding)を開き、Checkedプロパティを選択します。
    7. 右側のコンボボックスの中にあるTextBoxVisibleを選択し、OKを押します。
    8. フォームにFormClosingイベントハンドラを作り、その中にProperties.Settings.Default.Save();と記述します。

    これで準備はできました。
    プログラムを実行すると、テキストボックスが表示されていて、チェックボックスにチェックがついているはずです。
    チェックボックスのチェックをつけたり消したりすると、テキストボックスのVisibleプロパティが切り替わります。

    ここで、チェックボックスにチェックがついている状態でプログラムを終了します。
    フォームを閉じたときに設定が保存され、もう一度実行すると、チェックがついている状態で始まります。
    このとき、C:\Documents and Settings\<UserName>\Local Settings\Application Data以下にuser.configというファイルが作成され、その中に設定が記録されています。

    ここからが問題です。
    今度はチェックボックスのチェックをはずした状態でプログラムを終了します。user.configにはTextBoxVisible = Falseという内容が記録されます。
    この状態で再度プログラムを実行すると、チェックボックスにチェックをつけてもテキストボックスが出てきません。

    これは .NET Framework のバグでしょうか? それとも、俺の理解不足によるものでしょうか?
    原因や対策をご存知でしたら、ご教示お願いいたします。

    2006年11月7日 16:47

回答

  •  シャノン さんからの引用

    これは .NET Framework のバグでしょうか? それとも、俺の理解不足によるものでしょうか?

    う~ん、バグなのかどうかははっきりわかりませんが、不可解な動きですね。falseで起動してtrueに切り替わらなくなった状態でも、他のボタンを押してVisible = trueをセットしてあげると、そこから先はチェックボックスに連動して動くようになります。

    また、Visibleではなくて、例えばEnabledにバインドした場合は、falseで起動しても、問題なくtrueに切り替わってくれます。

    全体的に見て、バグのような印象を受けます。

    2006年11月8日 5:35
    モデレータ

すべての返信

  • 6,7 の手順をやめてこんな感じですかね。
    私は制御されるほうをバインディングし制御するほうはバインディングしません。

            private void Form1_Load(object sender, EventArgs e)
            {
                this.checkBox1.Checked = Properties.Settings.Default.TextVisible;
            }
     
            private void checkBox1_CheckedChanged(object sender, EventArgs e)
            {
                this.textBox1.Visible = this.checkBox1.Checked;
            }
     
            private void Form1_FormClosing(object sender, FormClosingEventArgs e)
            {
                Properties.Settings.Default.Save();
            }
    2006年11月8日 4:31
  •  シャノン さんからの引用

    これは .NET Framework のバグでしょうか? それとも、俺の理解不足によるものでしょうか?

    う~ん、バグなのかどうかははっきりわかりませんが、不可解な動きですね。falseで起動してtrueに切り替わらなくなった状態でも、他のボタンを押してVisible = trueをセットしてあげると、そこから先はチェックボックスに連動して動くようになります。

    また、Visibleではなくて、例えばEnabledにバインドした場合は、falseで起動しても、問題なくtrueに切り替わってくれます。

    全体的に見て、バグのような印象を受けます。

    2006年11月8日 5:35
    モデレータ
  •  えムナウ さんからの引用

    6,7 の手順をやめてこんな感じですかね。

    ありがとうございます。
    それが着実で無難な方法でしょうか。
    ただ、そんなコードも十数行もあるとさすがに嫌になってきます…。

    2006年11月8日 13:13
  • 追加検証までしていただきまして、ありがとうございます。
    確かに、バインディングを介さずに直接 Visible = true にすれば、以降は動作することと、Enabled や ReadOnly 等のプロパティでは問題ないことを確認いたしました。
    VisualStudio 2005 SP1 Beta をインストールしても直りませんでしたので、フィードバックフォーラムの方に転載することにします。

    2006年11月8日 13:15
  •  シャノン さんからの引用

     えムナウ さんからの引用

    6,7 の手順をやめてこんな感じですかね。

    ありがとうございます。
    それが着実で無難な方法でしょうか。
    ただ、そんなコードも十数行もあるとさすがに嫌になってきます…。

    訂正します。

    チェックボックスとの連携なら楽でいいですが、メニューアイテムのチェックとの連携だったりすると、メニューアイテムはバインディングをサポートしないので、バグが修正されたとしても、どうしても連携コードを手書きしなければいけない箇所は残りますね。

    #だからといって開き直ってすべて手書き…にはしたくありませんけど。

     

    <追記>

    改めて考え直してみると、今回のように複数のコントロールのプロパティを1つの設定にバインドするには、すべてのプロパティの型が同じでなければならないという制約がつきますね。

    プロパティバインディング…バグがなくても、使えるかどうか微妙な代物かもしれないと思うようになってきました。

    設定の保存が簡単にできるというメリットだけ享受しておいて、バインディングは連携コードを手書きした方がいいかもしれません…。

    </追記>

    2006年11月8日 15:26