質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

2回答

6131閲覧

WPF で同じコレクションから選択させる ComboBox の SelectedItem が同調してしまう

twyujiro15

総合スコア217

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2017/09/05 07:08

編集2017/09/06 02:48

.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 プロパティを利用することでも問題を回避できました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

CollectionViewSource の振る舞いとしてはhihijijiさんの仰るとおりだと思います。

補足情報ですが、

xaml

1<ComboBox x:Name="combobox1" ItemsSource="{Binding Source={StaticResource collection}}" IsSynchronizedWithCurrentItem="False"/>

でも大丈夫かと。

投稿2017/09/05 08:16

ebiryo

総合スコア797

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

twyujiro15

2017/09/06 02:53

ComboBox コントロールにこんなプロパティがあるとは知りませんでした! 問題の原因は他の方の回答でわかりましたが、問題の解決方法としてはこちらのプロパティを使用することで一番スマートに対処できそうです。 ありがとうございました。
guest

0

ベストアンサー

<CollectionViewSource x:Key="collection" Source="{Binding Names}" />で生成した CollectionViewSource のインスタンスが選択位置を保持する役目も持っています。
SelectedItem プロパティはそれを参照しています。
独立した挙動にするには CollectionViewSource のインスタンスをもう一つ追加してください。
今回の場合は Names はただの配列ですから一つで行けると思いますが、ICollectionView等を実装したクラスだと別のインスタンスが必要です。
PS.よく見たら Names は都度生成しているのですね。

投稿2017/09/05 07:36

編集2017/09/05 07:55
hihijiji

総合スコア4150

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

twyujiro15

2017/09/06 02:51

なるほど、CollectionViewSource が選択位置を保持するんですね。コレクション表示のために使おうと思っていましたが、それだけをするには多機能すぎるオブジェクトのようですね。 質問文の追記にも書きましたが、試しに Array を使うことで問題を回避できました。確かに CollectionViewSource が原因のようです。 ちなみに、この問題を説明するために実際のコードをコンパクトにしたかったのですが、Names が都度生成されるようなコードになってしまいました。生成する/しないで挙動がだいぶ異なるので今後気を付けます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問