トップ回答者
コンボ ボックス (ComboBox) を、複数個設置した場合は?

質問
-
お世話になります。
[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
回答
-
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!)
-
横から失礼します。私も 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
すべての返信
-
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!)
-
横から失礼します。私も 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