2016-04-28 10 views
0

コンボボックスを別のコンボボックスにバインドする際に問題があります。私は最初のコンボボックスから2番目のコンボボックスを開始するメソッドにパラメータ(id)を動的に渡そうとしています。たとえば、最初のコンボボックスで最初の項目を選択した場合、2番目のコンボボックスは最初のコンボボックスから選択したパラメータで初期化されます。別のコンボボックスにコンボボックスをバインドする

XAML:

<ComboBox Name="ItServiceCmbox" ItemsSource="{Binding ItServiceMetricsNames}" DisplayMemberPath="ServiceName" SelectedValuePath="ServiceId" /> 
<ComboBox Name="MetricCmbox" ItemsSource="{Binding SelectedItem.MetricId, ElementName=ItServiceCmbox}" DisplayMemberPath="MetricName" SelectedValuePath="MetricId"/> 

のC#:

public partial class MainWindow : Window 
{ 
    readonly MetricsValuesHelper _metricsValuesHelper = new MetricsValuesHelper(new Repository()); 
    public static int SelectedService; 
    public static int SelectedMetric; 
    public ObservableCollection<ItServiceMetricsNames> ItServiceMetricsNames { get; set; }  

    public MainWindow() 
    { 
     InitializeComponent(); 
     this.DataContext = this; 
     SelectedService = Convert.ToInt32(ItServiceCmbox.SelectedItem); 
     ItServiceMetricsNames = new ObservableCollection<ItServiceMetricsNames>(); 
     ItServiceMetricsNames.Add(new ItServiceMetricsNames() 
     { 
      ServiceId = _metricsValuesHelper.GetServiceId(), 
      ServiceName = _metricsValuesHelper.GetServiceName(), 
      MetricId = _metricsValuesHelper.GetMetricId(SelectedService), 
      MetricName = _metricsValuesHelper.GetMetricName(SelectedService) 
     }); 
    } 
} 

そしてItServiceMetricsNamesクラス:

public class ItServiceMetricsNames 
{ 
    public List<int> ServiceId { get; set; } 
    public List<string> ServiceName { get; set; } 
    public List<int> MetricId { get; set; } 
    public List<string> MetricName { get; set; } 
} 

が、それは可能ですか?すべての回答ありがとう!

+0

「不明です。 2番目のComboBoxには何を表示する必要がありますか? ID、名前... !! – Amine

+0

いくつかのITサービスがあります。すべてのITサービスにはいくつかの指標があります。最初のコンボボックスITサービスで選択し、GetMetricName(SelectedService)メソッドに渡して、選択された(最初のコンボボックスで)ITサービスの2番目のコンボボックスメトリックに表示する必要があります。 – Eluvium

+0

表示名ですが、選択した値はIdでなければなりません – Eluvium

答えて

1

これは私が昨年働いたように厄介で、素朴な実装です。間違いなく良い方法があります。私のxamlで実際のバインドを試みるのではなく、イベントハンドラを作った。あなたは別の1つのコンボボックスに依存する場合は選択があるまで、あなたが依存コンボボックスが無効になって作ること

など、選択を変更し、それはドロップダウンだ閉じ、送信コンボボックスがフォーカスを失ったときにトリガーされるコンボボックスのイベントハンドラを作成することができ独立したコンボボックスで作られています。選択が行われると、適切なデータを使用して依存コンボボックスを作成して有効にします。 ProcessComboBoxesの方法は、あなたがやろうとしているものに応じて異なります

private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     // Independent ComboBox is the sender here 
     ProcessComboBoxes(sender as ComboBox); 
    } 

:あなたのコード内

イベントハンドラは次のようになります。しかし、本質的には、コンディショナルに挿入するターゲット/依存コンボボックスを識別します。コンボボックスからコンボボックスにマップするディクショナリまたは適切と思われるものでこれを行います。ターゲットを特定したら、以前に追加したアイテムをすべて消去してから、新しいアイテムを再作成します。以下は、擬似コードの方法です(実際には)。

private void ProcessComboBoxes(ComboBox senderBox) 
    { 
     ComboBox dependentBox = lookupDependent[senderBox]; 

     var itemType = itemTypes[senderBox.selectedIndex]; 
     var listOfItemsNeeded = lookupItemsByType[itemType]; 
     dependentBox.Items.Clear(); 

     foreach (string item in listOfItemsNeeded){ 
      dependentBox.Items.Add(item); 
     } 

     dependentBox.IsEnabled = true; 
    } 

xamlにイベントハンドラを追加することを忘れないでください。イベントの呼び出し階層に細心の注意を払い、依存するコンボボックスをいつ再投入するかを決定してください。

+0

これは私が必要と思うものです。助けてくれてありがとう – Eluvium

関連する問題