2014-12-01 3 views
0

Привет У меня есть ComboBox в элементе ListView, ComboBox использует один ObservableCollection, а ListView использует другой. Как установить выбранный элемент ComboBox в значение столбца в элементе listview?WPF Как установить selecteditem связанного combobox в listview с разными itemsource

элемент управления ListView использует GridView, определенный следующим образом:

 <GridView x:Key="manage_calls_gridView"> 
     <GridViewColumn Header="Name" DisplayMemberBinding="{Binding MCName}" /> 
     <GridViewColumn Header="Allocated To" DisplayMemberBinding="{Binding MCPostCode}" /> 
     <GridViewColumn Header="Post Code" Width="180" CellTemplate="{StaticResource manage_calls_pcode}" /> 
    </GridView> 

С ComboBox, определенной в DataTemplate следующим образом:

 <DataTemplate x:Key="manage_calls_pcode"> 
     <ComboBox Width="180" DropDownClosed="mc_pcode_DropDownClosed" DataContext="{Binding DataContext,RelativeSource={RelativeSource AncestorType={x:Type ListView}}}" 
        ItemsSource="{Binding Path=LookUpCollection_6}" 
        DisplayMemberPath="Desc" 
        /> 
    </DataTemplate> 

Это класс выпадающий список использует для своей ObservableCollection (LookUpCollection_6)

 public class LookUp 
    { 
     public string Id { get; set; } 
     public string Desc { get; set; } 
    } 

Это класс ListView, содержащий C omboBox, использует для своей ObservableCollection (SalesAgentList)

 public class SalesAgentRec 
    { 
     public string MCName { get; set; } 
     public string MCPostCode { get; set; } 
     public string MCSource { get; set; } 
     public string MCUid { get; set; } 
     public string MCRecs { get; set; } 
    } 

мне нужно установить выбранный пункт/значение ComboBox к значению MCPostCode.

Заранее благодарен,

Steve.

ответ

2

ли это в вашем классе/модели данных
и падение DataContext

public class SalesAgentRec 
    { 
     public string MCName { get; set; } 
     public string MCPostCode { get; set; } 
     public string MCSource { get; set; } 
     public string MCUid { get; set; } 
     public string MCRecs { get; set; } 
     public List<LookUpCollection_6> { get; set; } 
    } 

SelecteIndex = "{Binding Path = MCPostCode}"

А для простого ID Desc так использовать словарь , Два свойства - это ключ и значение.

+0

Привет, Блэм, я принял ваш ответ в качестве ответа, поскольку это было самым полезным для меня на правильном пути. Спасибо, что нашли время ответить. – SteveP

0

Есть ли причина, почему это не сработает?

<DataTemplate x:Key="manage_calls_pcode"> 
    <ComboBox Width="180" DropDownClosed="mc_pcode_DropDownClosed" 
     ItemsSource="{Binding DataContext.LookUpCollection_6 ,RelativeSource={RelativeSource AncestorType={x:Type ListView}}}" 
     SelectedItem="{Binding MCPostCode}" 
     DisplayMemberPath="Desc" /> 
</DataTemplate> 

Вместо установки ComboBox.DataContext к родительскому ListView - ItemsSoruce теперь устанавливается непосредственно, что позволяет получить доступ к значению строки «MCPostCode». Разве я что-то пропустил?

+0

Привет, Олите, спасибо, что нашли время, чтобы ответить на мой вопрос. Ваше решение не работает в моем случае. – SteveP

+0

Не беспокойтесь. @Blam имеет наилучший подход, помещая данные, которые ваш взгляд нуждается в вашей модели. – olitee

0

Вот окончательное решение, которое сработало для меня.

Изменен DataTemplate для ComboBox:

 <DataTemplate x:Key="manage_calls_pcode"> 
     <ComboBox Width="90" SelectedIndex="{Binding Path=MCPostCodeX}" DropDownClosed="mc_pcode_DropDownClosed" 
        ItemsSource="{Binding Path=MCCodes}" 
        DisplayMemberPath="Value" 
        Tag="{Binding Path=MCSIndex}" 
        /> 
    </DataTemplate> 

Изменение использовать словарь для ItemSource для ComboBox:

public Dictionary<int, string> PCodeList = new Dictionary<int,string>(); 

Метод, используемый для загрузки Словарь

 ArrayList lkl = serl.ListLookupsC(0); 
     if (lkl.Count > 1) 
     { 
      LookUpCollection_6.Clear(); 
      LookUpCollection_7.Clear(); 
      for (int x = 0; x < lkl.Count; x++) 
      { 
       string[] strLData = (string[])lkl[x]; 
       PCodeList.Add(x, strLData[1]); 
      } 
     } 

Изменение класса SalesAgentRec

 public class SalesAgentRec 
    { 
     public string MCName { get; set; } 
     public string MCPostCode { get; set; } 
     public string MCSource { get; set; } 
     public string MCUid { get; set; } 
     public string MCRecs { get; set; } 
     public Dictionary<int, string> MCCodes { get; set; } 
     public int MCPostCodeX { get; set; } 
     public string MCSIndex { get; set; } 
    } 

метод для загрузки коллекции SalesAgentList

private void GetSalesAgents() 
    { 
     this.Cursor = Cursors.Wait; 
     SerUsers seru = new SerUsers(); 
     ArrayList al = seru.GetTeleSales(); 
     _SalesAgentList.Clear(); 
     if (al.Count == 0) 
     { 
      this.Cursor = Cursors.Arrow; 
      return; 
     } 
     for (int x = 0; x < al.Count; x++) 
     { 
      string[] strData = (string[])al[x]; 
      int nIndex = -1; 
      // Use LINQ to find the key for the value 
      if (strData[2].Length == 2) 
      { 
       var item = (from d in PCodeList 
          where d.Value.Substring(0, 2) == strData[2] 
          select d.Key).FirstOrDefault(); 

       nIndex = (int)item; 
      } 
      _SalesAgentList.Add(new SalesAgentRec{ 
       MCUid = strData[0], 
       MCName = strData[1], 
       MCPostCode = strData[2], 
       MCCodes = PCodeList, 
       MCPostCodeX = nIndex, 
       MCSIndex = x.ToString() 
      }); 
     } 
     this.manage_calls_listView.View = this.manage_calls_listView.FindResource("manage_calls_gridView") as ViewBase; 
     this.Cursor = Cursors.Arrow; 
    } 

Приведенный выше код еще не был оптимизирован для работы или обработки ошибок и чисто было использовано, чтобы проверить ответы в комплект поставки. Значения, возвращаемые serl.ListLookupC (0), будут уникальными из-за характера SQL-запроса в этом методе.

Еще раз спасибо всем, кто нашел время ответить.