.NET Framework 4.6 の WPF で
ComboBox の挙動について調査しています。
MainWindow.xaml のコードを以下のようにします。
ComboBox コントロールを 2 つ並べ、TextBlock コントロールで 1 つめの選択アイテムを表示させています。
XAML
1<Window x:Class="WpfApplication1.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:sys="clr-namespace:System;assembly=mscorlib" 5 Title="MainWindow" Height="350" Width="525"> 6 <StackPanel> 7 <StackPanel.Resources> 8 <CollectionViewSource x:Key="collection" Source="{Binding Names}" /> 9 </StackPanel.Resources> 10 11 <ComboBox x:Name="combobox1" ItemsSource="{Binding Source={StaticResource collection}}" IsEnabled="False" /> 12 <ComboBox x:Name="combobox2" ItemsSource="{Binding Source={StaticResource collection}}" /> 13 <TextBlock Text="{Binding SelectedItem, ElementName=combobox1}" /> 14 </StackPanel> 15</Window> 16
MainWindow.xaml.cs のコードを以下のようにしています。
ComboBox コントロールの参照元となるコレクションを用意しています。
C#
1namespace WpfApplication1 2{ 3 using System.Windows; 4 5 /// <summary> 6 /// MainWindow.xaml の相互作用ロジック 7 /// </summary> 8 public partial class MainWindow : Window 9 { 10 public MainWindow() 11 { 12 InitializeComponent(); 13 this.DataContext = this; 14 } 15 16 public string[] Names 17 { 18 get 19 { 20 return new string[] 21 { 22 "item1", 23 "item2", 24 "item3", 25 "item4", 26 }; 27 } 28 } 29 } 30}
このとき、2 つめの ComboBox の選択を変更すると、なぜか 1 つめの ComboBox の選択も同じように変わってしまいます。
どちらの ItemsSource も同じ静的なコレクションを参照していることによる弊害かと思われますが、仕組みがよくわかりません。
参照元は同じでも SelectedItem プロパティはそれぞれが持っているんだから、そこは別々の挙動になると思っていました。
なぜこのような現象になるのか説明していただけないでしょうか。
(2017/09/06 追記)
解決できました。ありがとうございます。
回答を参考に CollectionViewSource を使わず、Array を使用することで問題を回避できました。
XAML
1<Window x:Class="WpfApplication1.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:sys="clr-namespace:System;assembly=mscorlib" 5 Title="MainWindow" Height="350" Width="525"> 6 <StackPanel> 7 <StackPanel.Resources> 8 <!--<CollectionViewSource x:Key="collection" Source="{Binding Names}" />--> 9 <x:Array x:Key="array" Type="{x:Type sys:String}"> 10 <sys:String>item1</sys:String> 11 <sys:String>item2</sys:String> 12 <sys:String>item3</sys:String> 13 <sys:String>item4</sys:String> 14 </x:Array> 15 </StackPanel.Resources> 16 17 <ComboBox x:Name="combobox1" ItemsSource="{Binding Source={StaticResource array}}" /> 18 <ComboBox x:Name="combobox2" ItemsSource="{Binding Source={StaticResource array}}" /> 19 <TextBlock Text="{Binding SelectedItem, ElementName=combobox1}" /> 20 </StackPanel> 21</Window> 22
また、ComboBox.IsSynchronizedWithCurrentItem プロパティを利用することでも問題を回避できました。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/09/06 02:53