none
Comboboxの値の保存と表示について RRS feed

  • 質問

  • isual Studio 2015 の C# XAML 環境で Windows Phone 8.1 向けのアプリを作っています。

    Combobox(コンボボックス)を利用して、5つほどの選択肢の色(値)から選択してもらい、画面の背景色を変更するようなことをしたいのですが。

    そのコンボボックスで色を選択しても、いったんアプリを終了させるとコンボボックスの値は初期値(IsSelectedのもの)に戻ってしまいます。

    そこで、指定した色(値)を保存して、またアプリを起動したときに指定した値がコンボボックスに表示されているようにしたいと思っています。

    「Windows.Storage.ApplicationData.Current.LocalSettings」を使って保存と書き出しをするのだろうと思っているのですが、コンボボックスに対してどういう風にすればよいのか分かりません。

    指定の方法などアドバイスをよろしくお願いします。

    追記: Windows Phone の設定でいうところの、「テーマ色」 を 「白、黒」 で選んで、電源を落としてもその状態を保持している、という感じです。

    • 編集済み hirochy01 2016年3月19日 12:00
    2016年3月19日 11:52

回答

  • IndexとValueがたまたま同じなため動作しているだけではないでしょうか。
    ※要素のインデックスで保持したいのであればそれでも良いですが。

    ComboBoxのSelectedValuePathにTagを指定していますか?

    • 回答としてマーク hirochy01 2016年3月21日 3:10
    2016年3月20日 6:36
    モデレータ

すべての返信

  • こんにちは。

    設定の保存先がLocalSettingsで正しいかどうかはアプリケーションによると思いますが以下を参照してください。
    設定値なのであとは端末を跨いで設定値の同期を行うかどうかですが。

    https://msdn.microsoft.com/ja-jp/library/windows/apps/xaml/hh465099.aspx

    ここまで出来ていれば、ほぼ実現するための材料は揃っていそうですが、どのあたりが不明でしたでしょうか。
    コンボボックスで選択した値をアプリケーションでどのように扱っているか、どのタイミングで設定値を保存したいのか、は設計済みでしょうか。

    設定ファイルに保存したいのがコンボボックスの選択値であれば、任意のタイミングでそれを保存し、任意のタイミングで復元・反映を行うだけなのですが…

    2016年3月19日 13:46
    モデレータ
  • 返信ありがとうございます。

    実はコンボボックスの操作事態に慣れていないというか初心者なので、基本的というか具体的なコンボボックスの内容に対する操作方法(命令)が分かっていません。

    選択されている色(色の名前:値)の保存は出来ているのですが、コンボボックスで その項目が選択されている状態にする方法が分かりません。

    ((ComboboxItem)cbname.SelectedValue).Content = localSetteings.value["savedvalue"];

    のように考えたのですが、これだと初期(IsSelectedされたComboboxItem)の値を書き換えてしまいます。 

    XAMLでいうところの IsSelected を、 C#側で指定したい(記憶させて、起動時にその値を指定したい)ということなのですが、アドバイスよろしくお願いします。

    2016年3月19日 23:39
  • コンボボックスはどのように構築しているでしょうか。

    cbname.ItemsSourceにコレクションを設定し、SelectedValuePathを設定していますか?
    SelectedValueに値を設定してやることで動作しないでしょうか。

    ※手元のWindowsPhone8.1エミュレータが動作せず…未確認です。

    2016年3月20日 0:58
    モデレータ
  • 返信ありがとうございます。

    すみません、なにぶん初心者なもので、「cbname.ItemsSourceにコレクションを設定し、SelectedValuePathを設定していますか?」の意味が理解できません。 キーワードを頼りにいろいろ検索してみます。

    よろしければ参考になる例やサンプル的なサイトなどあれば教えてもらえればと思います。(たぶん自分は Comboboxの基本が分かってないんだと思います。)

    ちなみに、コンボボックスについては XAMLで以下のように初期設定をしてあります。

    <ComboBox x:Name="cbname"
                          HorizontalAlignment="Left"
                          VerticalAlignment="Top"
                          Width="200" Margin="152,135,0,0"
                          DropDownClosed="myChooseColorComboBox_DropDownClosed"
                          >
                    <ComboBoxItem Tag="0" Content="White"/>
                    <ComboBoxItem Tag="1" Content="Blue" IsSelected="True"/>
                    <ComboBoxItem Tag="2" Content="Red"/>
                    <ComboBoxItem Tag="3" Content="Black"/>
                </ComboBox>

    たとえば、これの 「Red」 を選択してアプリを終了しても、また起動したときに 「Red」 が選択されている状態にしたいと思っています。


    • 編集済み hirochy01 2016年3月20日 3:31
    2016年3月20日 3:23
  • ItemsSourceを使わずにComboBoxItemとTagを使っているのですね。
    その場合にこのやり方で良いのかわからないのですが、
    ComboBoxのSelectedValuePathにTagを設定し、起動時にcbname.SelectedValueを設定してみると動くと思います。

    <ComboBox x:Name="cbname"
              HorizontalAlignment="Left"
              VerticalAlignment="Top"
              Width="200" Margin="152,135,0,0"
              SelectedValuePath="Tag"
        >
        <ComboBoxItem Tag="0" Content="White"/>
        <ComboBoxItem Tag="1" Content="Blue"/>
        <ComboBoxItem Tag="2" Content="Red"/>
        <ComboBoxItem Tag="3" Content="Black"/>
    </ComboBox>
    //Blackを選択
    cbname.SelectedValue = "3";


    2016年3月20日 4:07
    モデレータ
  • 返信ありがとうございます。

    cbname.SelectedValue = "3";

    ではなぜかうまくいかなかったのですが

    cbname.SelectedIndex = "3";

    とやったら目的の動作が確認できました。 もう少しいろいろ調べてみて、この方法を採用しようと思います。

    本当にありがとうございました。 助かりました。

    2016年3月20日 6:07
  • IndexとValueがたまたま同じなため動作しているだけではないでしょうか。
    ※要素のインデックスで保持したいのであればそれでも良いですが。

    ComboBoxのSelectedValuePathにTagを指定していますか?

    • 回答としてマーク hirochy01 2016年3月21日 3:10
    2016年3月20日 6:36
    モデレータ
  • 返信ありがとうございます。 たびたびすみません。

    なるほど、やっとシッカリ理解できました。 SelectedValuePath というのが どこでやるものなのか知らなかったのですが、 ComboBoxタグ内で指定するものなんですね。 以下のようにしました。

    これで Value と Tag が紐づけされる、ということなんですね。

    <ComboBox x:Name="cbname"
      HorizontalAlignment="Left" VerticalAlignment="Top"
        Width="200" Margin="152,135,0,0"
         SelectedValuePath="Tag" >
          <ComboBoxItem Tag="0" Content="White"/>
          <ComboBoxItem Tag="1" Content="Blue" IsSelected="True"/>
          <ComboBoxItem Tag="2" Content="Red"/>
          <ComboBoxItem Tag="3" Content="Black"/>
    
    </ComboBox>
    これで、

    cbname.SelectedValue = "3";

    で指定することができるようになりました。 

    重ねてお礼します、ありがとうございました。


    • 編集済み hirochy01 2016年3月20日 8:00
    2016年3月20日 7:40
  • 解決済みなのですが、参考としてEnumを利用した実現方法のサンプルコードを作成してみましたので、ご紹介しておきます。

    【WPF】 ComboBoxにEnumをバインドする
    https://code.msdn.microsoft.com/WPF-ComboBoxEnum-ddd26709


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    2016年3月22日 3:16
    モデレータ
  • trapemiyaさん、返信ありがとうございます。 いろいろ勉強中なので助かります。
    2016年3月23日 10:53