2016-04-28 6 views
0

У меня проблема с привязкой combobox к другому combobox. Я пытаюсь динамически передать параметр (id) из первого combobox в метод запуска второго combobox. Например, если я выбрал первый элемент в первом поле со списком, то второй combobox будет инициализироваться параметром, выбранным из первого списка.Связывание combobox с другим combobox

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

Его не ясно. Что должен отображать второй ComboBox? Id, Name ... !! – Amine

+0

Существует несколько ИТ-сервисов. У каждого ИТ-сервиса есть несколько показателей. Я должен выбрать в первой IT-службе combobox и передать ее методу GetMetricName (SelectedService) для отображения во вторых метках combobox для выбранного (в первом combobox) IT-сервиса. – Eluvium

+0

Отображаемое имя, но выбранное значение должно быть Id – Eluvium

ответ

1

Это грязная, наивная реализация, которую я сделал в прошлом году, которая, казалось, работала. Там определенно лучший выход. Вместо того, чтобы пытаться сделать какие-либо фактические привязки в моем xaml я сделал обработчики событий. Вы можете создавать обработчики событий для ComboBox, которые запускаются всякий раз, когда отправляющий ComboBox теряет фокус, закрывает его DropDown, меняет выбор и т. Д.

Если вы хотите, чтобы один ComboBox зависел от другого, вы можете отключить зависимый ComboBox до тех пор, пока не будет выбран сделанный в независимом ComboBox. После выбора вы заполняете и включаете зависимый ComboBox с соответствующими данными.

обработчики событий в код будет выглядеть примерно так:

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

Метод ProcessComboBoxes будет выглядеть по-разному в зависимости от того, что вы пытаетесь сделать. Но, по сути, он определит целевой/зависимый ComboBox, который вы хотите условно заполнить, - сделайте это либо с помощью Словаря, который отображает ComboBox, так и 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. Обязательно обратите пристальное внимание на иерархию событий вызовов и определите, когда именно вы хотите, чтобы ваш зависимый ComboBox был повторно заселен.

+0

Я думаю, что это то, что мне нужно. Спасибо за помощь – Eluvium