none
WPFアプリケーションの急停止について RRS feed

  • 質問

  • こんにちは。
    WPFのアプリケーションが突然が終了してしまう理由がよくわからないので質問させて頂きます。

    状態
    WPFアプリケーションのプログラムをOnceClickで配布、ユーザーのPCでは突然アプリケーションが終了する異常が発生している。(開発環境化では問題なし)
    ユーザーのPC:WindowsXPx86 Windows7x86
    開発者のPC:Windows7x86(デバッグでもインストールでも動作)

    問題の流れ
    ・Frame要素にView(Page)をNavigateメソッドで画面遷移する。
    ・ViewのDataContextにViewModelを代入している。
    ・ViewModelのIDというバインドで使用しているプロパティが原因で終了していることがわかった。
    ・それ以外のバインドで使用しているプロパティは全て正常に動作していることがわかった。
    ・ViewのXAMLをTextBoxからLabelに変更した所、全てのPCで動作するようになった。

    困っていること
    ・なぜLabelにしたら動くようになったのか? 修正できているように思えない。再度起こる可能性があり怖くなっている。
    ・自分のPCではなぜ動いていて、ユーザーのPCで動かなくなったのかよくわからない。
    ・原因がローカルを参照しているならまだしも、ただのIDというプロパティというのが不明。IDプロパティは初期値nullをそのまま表示し続けるだけの簡素なものに変更しても同じくアプリケーションはすぐに落ちる。

    <TextBox Grid.Column="1" Grid.Row="1" Content="{Binding PartsID}" HorizontalContentAlignment="Center" />

    XAMLファイルの問題箇所

    /// <summary>
    /// 部品ID
    /// </summary>
    public int? ID {
        get { return this._partsID; }
        private set {
            _partsID = value;
            RaisePropertyChanged("ID");
        }
    }

    ViewModelの問題箇所



    全く取っ掛かりが掴めず理解に苦しんでいます。
    以上です、よろしくお願いします。

    2013年7月16日 6:20

すべての返信

  • > <TextBox Content="{Binding PartsID}" />

    そもそも TextBox に Content プロパティは存在しませんが・・・ビルドエラーになりませんか?


    ひらぽん http://d.hatena.ne.jp/hilapon/

    2013年7月16日 6:42
    モデレータ
  • すいません。

    TextBoxの時はTextプロパティにバインドしていました。

    2013年7月16日 6:43
  • なんとなくですが、問題点が少しわかりました。
    TextBoxのBindingにMode=OneWayを追加した所、正常に動作するようになりました。

    TextBoxのBindingはデフォルトでTwoWay、LabelはOneWayなのかもしれず、またプロパティのSetはPrivateにしていたためのが原因だと考えました。
    (デフォルトのBindingがなにか調べてみましたが、MSDNにそれらしい情報がなかったです)
    http://msdn.microsoft.com/ja-jp/library/system.windows.controls.textbox.aspx

    ただし、それならそれで、なぜ開発用のPCでは動いていたのか理解に苦しみます。
    また、なぜエラーもなくいきなり落ちてしまうのかもよくわかりません。
    なにか情報があれば、教えて頂けると助かります。

    以上、よろしくお願いします。
    2013年7月16日 7:36
  • TextBoxのBindingはデフォルトでTwoWay、LabelはOneWayなのかもしれず、またプロパティのSetはPrivateにしていたためのが原因だと考えました。
    (デフォルトのBindingがなにか調べてみましたが、MSDNにそれらしい情報がなかったです)
    http://msdn.microsoft.com/ja-jp/library/system.windows.controls.textbox.aspx

    TextBox の既定のバインディングモードは、以下のドキュメントに記述されてますね。

    Binding.Mode プロパティ

    一般に、ユーザーが編集できる、テキスト ボックスやチェック ボックスなどのコントロール プロパティは既定で双方向のバインディングであり、それ以外のほとんどのプロパティは既定で一方向のバインドになります」

    とのことです。



    ひらぽん http://d.hatena.ne.jp/hilapon/

    2013年7月16日 8:11
    モデレータ
  • XAMLではPartsIDにバインドしていますが、プロパティ名はIDになっています。再現するコードを最低限でかまいませんので、掲載できませんか? 掲示されているコード以外のところに何か問題があるのだと思います。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2013年7月16日 8:22
    モデレータ
  • すいません。その間違いはプロパティ名IDからPartsIDに変更したりしていました。掲載時のミスです。

    IDからPartsIDに変更した理由は、もしかしてXAMLで予約語のように使用しているから挙動がおかしくなっているのかもしれない、と疑って変更してみました。あまり関係なかったですが。

    現在は、動作は安定していて問題ない状態になっています。

    落ちてしまう理由は何となくBindingの問題であると判明したと思っていますが、エラーウィンドウが表示されない問題が疑問になっています。これを少し検証してみたところ、リモートデスクトップでXPを動作させるとエラーウィンドウが出ずに強制終了し、クライアントのPCでXPか Win7上で直接動作させると、エラーウィンドウが出て強制終了するようでした。

    また、なぜ開発PCでは正常に動作していたのか? と、いう疑問は全く解消されていない状態です。

    別の所なんだとしたら、ちょっと困る感じです。

    2013年7月18日 4:35