none
コンボ ボックス (ComboBox) を、複数個設置した場合は? RRS feed

  • 質問

  • お世話になります。

    [C#/XAML] コンボ ボックス (ComboBox) で選択された項目を取得する (WPF)

    このページを参考に、コンボ ボックス (ComboBox)を二つ設置してみました。

    しかし、値の取得どころかエラーになってしまいうまくできません。

    サンプルの様に、二つ並べただけでは駄目なんでしょうか。

            <x:Array x:Key="SampleData" Type="{x:Type local:Person}"> 
                <local:Person ID="1" Name="新宿 一郎" /> 
                <local:Person ID="2" Name="初台 次郎" /> 
                <local:Person ID="3" Name="大手町 三郎" /> 
                <local:Person ID="4" Name="代田橋 四朗" /> 
                <local:Person ID="5" Name="赤坂 五郎" /> 
            </x:Array> 
        </Window.Resources> 
            <y:Array y:Key="SampleData" Type="{y:Type local:Person}"> 
                <local:Person ID2="1" Name2="新宿 一郎" /> 
                <local:Person ID2="2" Name2="初台 次郎" /> 
                <local:Person ID2="3" Name2="大手町 三郎" /> 
                <local:Person ID2="4" Name2="代田橋 四朗" /> 
                <local:Person ID2="5" Name2="赤坂 五郎" /> 
            </y:Array> 
        </Window.Resources> 
    

    namespace ComboBox_WPF06 
    { 
        public class Person 
        { 
            private int _id; 
            public int ID 
            { 
                get { return _id; } 
                set { _id = value; } 
            } 
     
            private string _name; 
            public string Name 
            { 
                get { return _name; } 
                set { _name = value; } 
            } 
           private int _id2; 
            public int ID2 
            { 
                get { return _id2; } 
                set { _id2 = value; } 
            } 
     
            private string _name2; 
            public string Name2 
            { 
                get { return _name2; } 
                set { _name2 = value; } 
            } 
        } 
    }
    以上、よろしくお願い申し上げます。


    From taokato

    2014年2月16日 11:12

回答

  • XAMLの定義の仕方をいくつか間違えています。

    1.タグを<Window.Resource></Window.Resource>のように対応させていない。
    XML構文の詳細を参照。

    2.名前空間(NameSpace)でy:Array , y:Key , y:Typeと記述している。
    xmlns:xで宣言しているのをxmlns:yとして再度宣言することは可能ですが、通常は同じ宣言をすることはありません。
    下の例では"http://schemas.microsoft.com/winfx/2006/xaml"というuriでArray,Key,Typeといったものが何であるかの定義がされています。x:Array,y:Arrayとしても同じ定義を参照するので、わかりにくくなるだけです。

    3.x:Nameで定義する名前を重複してつけている
    同じ名前を付けることはできません。同じ名前ではどれを参照すればいいか区別ができないのでエラーになります。
    (ただし、名前スコープが異なれば同じ名前を記述できます)

    <Window x:Class="WpfApplication1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:WpfApplication1"
            Title="MainWindow" Height="350" Width="525">
    
        <Window.Resources>
            <x:Array x:Key="SampleData1" Type="{x:Type local:Person}">
                <local:Person ID="1" Name="新宿 一郎" />
                <local:Person ID="2" Name="初台 次郎" />
                <local:Person ID="3" Name="大手町 三郎" />
                <local:Person ID="4" Name="代田橋 四朗" />
                <local:Person ID="5" Name="赤坂 五郎" />
            </x:Array>
            <x:Array x:Key="SampleData2" Type="{x:Type local:Person}">
                <local:Person ID2="1" Name2="新宿 一郎" />
                <local:Person ID2="2" Name2="初台 次郎" />
                <local:Person ID2="3" Name2="大手町 三郎" />
                <local:Person ID2="4" Name2="代田橋 四朗" />
                <local:Person ID2="5" Name2="赤坂 五郎" />
            </x:Array>
        </Window.Resources>
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition Height="*" />
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>
    
            <ComboBox x:Name="ComboBox1" 
                ItemsSource="{Binding Source={StaticResource SampleData1}}"  
                DisplayMemberPath="Name"  
                SelectedValuePath="ID" 
                Margin="5" />
            <TextBox Grid.Row="2" Margin="5" Text="{Binding SelectedValue, ElementName=ComboBox1}" />
            <TextBox Grid.Row="3" Margin="5" Text="{Binding SelectedItem.Name, ElementName=ComboBox1}" />
    
            <!-- ***************************** -->
            
            <ComboBox x:Name="ComboBox2" Grid.Column ="1"
                ItemsSource="{Binding Source={StaticResource SampleData2}}"  
                DisplayMemberPath="Name2"  
                SelectedValuePath="ID2" 
                Margin="5" />
    
            <TextBox Grid.Row="2" Grid.Column="1" Margin="5" Text="{Binding SelectedValue, ElementName=ComboBox2}" />
            <TextBox Grid.Row="3" Grid.Column="1" Margin="5" Text="{Binding SelectedItem.Name2, ElementName=ComboBox2}" />
    
        </Grid>
    </Window>
    


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答の候補に設定 星 睦美 2014年2月18日 4:07
    • 回答としてマーク 星 睦美 2014年2月27日 8:30
    2014年2月16日 17:25
  • 横から失礼します。私も gekka さんのコードを試してみましたが、正常に動作しました。
    もしかして XAML名前空間(xmlns 属性) の設定が間違ってないでしょうか?

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



    • 編集済み ひらぽんModerator 2014年2月17日 4:45 判りやすいようリンクを追加した
    • 回答の候補に設定 星 睦美 2014年2月18日 4:07
    • 回答としてマーク 星 睦美 2014年2月27日 8:30
    2014年2月17日 4:41
    モデレータ

すべての返信

  • XAMLの定義の仕方をいくつか間違えています。

    1.タグを<Window.Resource></Window.Resource>のように対応させていない。
    XML構文の詳細を参照。

    2.名前空間(NameSpace)でy:Array , y:Key , y:Typeと記述している。
    xmlns:xで宣言しているのをxmlns:yとして再度宣言することは可能ですが、通常は同じ宣言をすることはありません。
    下の例では"http://schemas.microsoft.com/winfx/2006/xaml"というuriでArray,Key,Typeといったものが何であるかの定義がされています。x:Array,y:Arrayとしても同じ定義を参照するので、わかりにくくなるだけです。

    3.x:Nameで定義する名前を重複してつけている
    同じ名前を付けることはできません。同じ名前ではどれを参照すればいいか区別ができないのでエラーになります。
    (ただし、名前スコープが異なれば同じ名前を記述できます)

    <Window x:Class="WpfApplication1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:WpfApplication1"
            Title="MainWindow" Height="350" Width="525">
    
        <Window.Resources>
            <x:Array x:Key="SampleData1" Type="{x:Type local:Person}">
                <local:Person ID="1" Name="新宿 一郎" />
                <local:Person ID="2" Name="初台 次郎" />
                <local:Person ID="3" Name="大手町 三郎" />
                <local:Person ID="4" Name="代田橋 四朗" />
                <local:Person ID="5" Name="赤坂 五郎" />
            </x:Array>
            <x:Array x:Key="SampleData2" Type="{x:Type local:Person}">
                <local:Person ID2="1" Name2="新宿 一郎" />
                <local:Person ID2="2" Name2="初台 次郎" />
                <local:Person ID2="3" Name2="大手町 三郎" />
                <local:Person ID2="4" Name2="代田橋 四朗" />
                <local:Person ID2="5" Name2="赤坂 五郎" />
            </x:Array>
        </Window.Resources>
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition Height="*" />
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>
    
            <ComboBox x:Name="ComboBox1" 
                ItemsSource="{Binding Source={StaticResource SampleData1}}"  
                DisplayMemberPath="Name"  
                SelectedValuePath="ID" 
                Margin="5" />
            <TextBox Grid.Row="2" Margin="5" Text="{Binding SelectedValue, ElementName=ComboBox1}" />
            <TextBox Grid.Row="3" Margin="5" Text="{Binding SelectedItem.Name, ElementName=ComboBox1}" />
    
            <!-- ***************************** -->
            
            <ComboBox x:Name="ComboBox2" Grid.Column ="1"
                ItemsSource="{Binding Source={StaticResource SampleData2}}"  
                DisplayMemberPath="Name2"  
                SelectedValuePath="ID2" 
                Margin="5" />
    
            <TextBox Grid.Row="2" Grid.Column="1" Margin="5" Text="{Binding SelectedValue, ElementName=ComboBox2}" />
            <TextBox Grid.Row="3" Grid.Column="1" Margin="5" Text="{Binding SelectedItem.Name2, ElementName=ComboBox2}" />
    
        </Grid>
    </Window>
    


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答の候補に設定 星 睦美 2014年2月18日 4:07
    • 回答としてマーク 星 睦美 2014年2月27日 8:30
    2014年2月16日 17:25
  • ご回答を頂きまして、ありがとう御座います。

    実際に組んでみると、次のようなエラーメッセージが出てきました。

    エラー 2 メンバー "Name2" が認識されないか、アクセスできません。 F:\hoge\hoge\MainWindow.xaml

    これに対する方法を、ご教示下さい。

    よろしくお願い申し上げます。


    From taokato

    2014年2月17日 3:49
  • 横から失礼します。私も gekka さんのコードを試してみましたが、正常に動作しました。
    もしかして XAML名前空間(xmlns 属性) の設定が間違ってないでしょうか?

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



    • 編集済み ひらぽんModerator 2014年2月17日 4:45 判りやすいようリンクを追加した
    • 回答の候補に設定 星 睦美 2014年2月18日 4:07
    • 回答としてマーク 星 睦美 2014年2月27日 8:30
    2014年2月17日 4:41
    モデレータ
  • フォーラム オペレーターの星 睦美です。taokato さん、こんにちは。

    参考になったと投票されたスレッドに、今回は私のほうで[回答としてマーク] させていただきました。
    次回役立つ回答がありましたら、投稿者からの[回答としてマーク] をお願いします。

    それでは今後ともMSDN フォーラムをお役立てください。


    フォーラム オペレーター 星 睦美 - MSDN Community Support

    2014年2月27日 8:35