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

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

新規登録して質問してみよう
ただいま回答率
85.50%
UWP

UWPは、Universal Windows Platformの略。様々なデバイス向けに提供されているアプリケーションを共通のフレームワーク上で動作可能にする仕組みで、Windows10で導入されました。

Q&A

解決済

1回答

2331閲覧

一つ目のコンボボックスの選択より、二つ目のコンボボックスのメニューを変更したい

bluerail

総合スコア12

UWP

UWPは、Universal Windows Platformの略。様々なデバイス向けに提供されているアプリケーションを共通のフレームワーク上で動作可能にする仕組みで、Windows10で導入されました。

0グッド

0クリップ

投稿2019/05/09 04:41

前提・実現したいこと

UWPのアプリつについて質問させていただきます。言語はC#を使用しており、MWWM方式で、prism.windowsを使用しております。
実現したいことは、二つのコンボボックスがあり、一つ目のコンボボックス(グループ)の選択により、二つ目のコンボボックス(明細)のメニューを変更したい。

発生している問題・エラーメッセージ

コンボボックス(グループ)にてAを選択すると、コンボボックス(明細)のメニューはA1が一つだけ表示される。次に、コンボボックス(グループ)にてBを選択すると、コンボボックス(明細)のメニューはA1のまま。本来は、B1、B2を表示したい。

該当のソースコード

C#

1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Text; 5using System.Threading.Tasks; 6 7using Prism.Mvvm; // add 8 9namespace TestComboBox2.ViewModels 10{ 11 public class MainPageViewModel:BindableBase 12 { 13 public Views.MainPage View { get; private set; } = null; 14 15 public void Initialize(Views.MainPage mainPage) 16 { 17 View = mainPage; 18 } 19 public MainPageViewModel() 20 { 21 // グループの追加 22 ChangeGroupId(); 23 } 24 private List<CbGroup> CbGroupList = new List<CbGroup>(); 25 public List<CbGroup> CbGroupLists 26 { 27 get { return CbGroupList; } 28 set { this.SetProperty(ref this.CbGroupList, value); } 29 } 30 private List<CbItem> CbItemList = new List<CbItem>(); 31 public List<CbItem> CbItemLists 32 { 33 get { return CbItemList; } 34 set { this.SetProperty(ref this.CbItemList, value); } 35 } 36 37 private string txGroupId; 38 public string TxGroupId 39 { 40 get { return txGroupId; } 41 set 42 { 43 this.SetProperty(ref this.txGroupId, value); 44 // アイテムの追加 45 ChangeItemId(txGroupId); 46 } 47 } 48 private string txItemId; 49 public string TxItemId 50 { 51 get { return txItemId; } 52 set { this.SetProperty(ref this.txItemId, value); } 53 } 54 private void ChangeGroupId() 55 { 56 CbGroupList.Add(new CbGroup("A", "A")); 57 CbGroupList.Add(new CbGroup("B", "B")); 58 CbGroupList.Add(new CbGroup("C", "C")); 59 } 60 private void ChangeItemId(string ValueId) 61 { 62 try 63 { 64 // 全件 削除する 65 if (CbItemLists != null) 66 { 67 CbItemList.Clear(); 68 } 69 TxItemId = null; 70 // 71 switch (ValueId) 72 { 73 case "A": 74 CbItemList.Add(new CbItem("A1", "A1")); 75 //CbItemList.Add(new CbItem("A2", "A2")); 76 //CbItemList.Add(new CbItem("A3", "A3")); 77 break; 78 case "B": 79 CbItemList.Add(new CbItem("B1", "B1")); 80 CbItemList.Add(new CbItem("B2", "B2")); 81 //CbItemList.Add(new CbItem("B3", "B3")); 82 break; 83 case "C": 84 CbItemList.Add(new CbItem("C1", "C1")); 85 CbItemList.Add(new CbItem("C2", "C2")); 86 CbItemList.Add(new CbItem("C3", "C3")); 87 break; 88 } 89 }catch(Exception ex) 90 { 91 string stErrMessage = ex.Message; 92 } 93 } 94 } 95 public class CbGroup 96 { 97 public string GroupId { get; set; } 98 public string GroupName { get; set; } 99 public CbGroup(string ValueId, string ValueName) 100 { 101 GroupId = ValueId; 102 GroupName = ValueName; 103 } 104 } 105 public class CbItem 106 { 107 public string ItemId { get; set; } 108 public string ItemName { get; set; } 109 public CbItem(string ValueId, string ValueName) 110 { 111 ItemId = ValueId; 112 ItemName = ValueName; 113 } 114 } 115} 116

C#

1<Page 2 x:Class="TestComboBox2.Views.MainPage" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 xmlns:local="using:TestComboBox2" 6 xmlns:views="using:TestComboBox2.Views" 7 xmlns:viewmodels="using:TestComboBox2.ViewModels" 8 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 9 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 10 mc:Ignorable="d" 11 Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 12 13 <Page.Resources> 14 <ResourceDictionary> 15 <ResourceDictionary.MergedDictionaries> 16 <ResourceDictionary Source="Style.xaml" /> 17 </ResourceDictionary.MergedDictionaries> 18 </ResourceDictionary> 19 </Page.Resources> 20 <Grid> 21 <StackPanel> 22 <StackPanel Orientation="Horizontal"> 23 <TextBlock Style="{StaticResource TextBlckFontSize}" 24 Text="グループ" 25 Foreground="Black" 26 /> 27 <ComboBox Style="{StaticResource ComboBoxStype}" 28 ItemsSource="{Binding CbGroupLists,Mode=OneWay}" 29 SelectedValue="{Binding TxGroupId,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" 30 SelectedValuePath="GroupId" 31 > 32 <ComboBox.ItemTemplate> 33 <DataTemplate> 34 <TextBlock> 35 <Run Text="{Binding GroupName,Mode=OneWay}"/> 36 </TextBlock> 37 </DataTemplate> 38 </ComboBox.ItemTemplate> 39 </ComboBox> 40 </StackPanel> 41 <StackPanel Orientation="Horizontal"> 42 <TextBlock Style="{StaticResource TextBlckFontSize}" 43 Foreground="Black" 44 Text="明細" 45 /> 46 <ComboBox Style="{StaticResource ComboBoxStype}" 47 ItemsSource="{Binding CbItemLists,Mode=OneWay}" 48 SelectedValue="{Binding TxItemId,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" 49 SelectedValuePath="ItemId" 50 > 51 <ComboBox.ItemTemplate> 52 <DataTemplate> 53 <TextBlock> 54 <Run Text="{Binding ItemName,Mode=OneWay}"/> 55 </TextBlock> 56 </DataTemplate> 57 </ComboBox.ItemTemplate> 58 </ComboBox> 59 </StackPanel> 60 </StackPanel> 61 </Grid> 62</Page> 63

C#

1using System; 2using System.Collections.Generic; 3using System.IO; 4using System.Linq; 5using System.Runtime.InteropServices.WindowsRuntime; 6using Windows.Foundation; 7using Windows.Foundation.Collections; 8using Windows.UI.Xaml; 9using Windows.UI.Xaml.Controls; 10using Windows.UI.Xaml.Controls.Primitives; 11using Windows.UI.Xaml.Data; 12using Windows.UI.Xaml.Input; 13using Windows.UI.Xaml.Media; 14using Windows.UI.Xaml.Navigation; 15 16namespace TestComboBox2.Views 17{ 18 public sealed partial class MainPage : Page 19 { 20 public ViewModels.MainPageViewModel ViewModel { get; private set; } = new ViewModels.MainPageViewModel(); 21 public MainPage() 22 { 23 this.InitializeComponent(); 24 ViewModel.Initialize(this); 25 this.DataContext = ViewModel; 26 } 27 } 28} 29

試したこと

コンボボックス(明細)はCbItemListにバインディングしています。CbItemList自体を調べると、B1・B2が代入されています。

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

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

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

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

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

guest

回答1

0

ベストアンサー

CbItemListsの内容更新がVM側からView側に通知できていないことが原因と思われます。

案1 RaisePropertyChanged(nameof(CbItemLists));をCbItemListの内容変更後(ChangeItemIdメソッドのswitchの後ろ)に追加する

List はCbItemLists.Clear()CbItemLists.Add(item)を呼び出しても中身の変更は通知されません。BindableBaseクラスを元にしたSetPropertyによる更新通知は実装されているようですが、CbItemListsに対する代入を行っていないためSetPropertyが呼ばれず、変更通知はされません。

つまりリストが更新されたことを手動で通知する必要があります。そのためRaisePropertyChangedを利用して強制的に通知します。

案2 CbItemListをObservableCollection<CbItem>で定義しなおす

ObservableCollectionはINotifyCollectionChangedを実装したコレクションでComboBox.SourceItemsにセットした場合、リスト内容の変更がリアルタイムに反映されます。

ObservableCollectionを利用する場合はRaisePropertyChanngedを使用する必要はありませんし、SetProperty等のセッターゲッター実装も不要になります。

public ObservableCollection<CbItem> CbItemLists { get; } = new ObservableCollection<CbItems>();

あとはClearやAddするだけでComboBox側にも変更が反映されるかと思います。

投稿2019/05/10 13:03

tor4kichi

総合スコア763

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

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

bluerail

2019/05/13 05:36

お陰様で、問題が解決しました。どうもありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問