2014-10-11 2 views
1

У меня есть два класса, как эти:Заливка ComboBox Элементы в WPF C#

public class Instance 
{ 
    /// <summary> 
    /// Identity of index 
    /// </summary> 
    public int Id { get; set; } 

    /// <summary> 
    /// Items within this group. 
    /// </summary> 
    public Dictionary<string, ItemRow> Items; 

    public Instance() 
    { 
     //Items = new Dictionary<string, ItemRow>(); 
     Items = new Dictionary<string, ItemRow>(); 
    } 
} 

public class GroupMemory 
{ 
    /// <summary> 
    /// Name of the OPC group 
    /// </summary> 
    public string Name { get; set; } 
    /// <summary> 
    /// Scan rate for this group. 
    /// </summary> 
    public string ScanRate { get; set; } 
    /// <summary> 
    /// Number of instances for this group. 
    /// </summary> 
    public int CountOfInstances { get; set; } 

    /// <summary> 
    /// Instances within this group. 
    /// </summary> 
    public Dictionary<int, Instance> Instances; 
    /// <summary> 
    /// Items within this group. 
    /// </summary> 
    public Dictionary<string, ItemRow> Items; 

    /// <summary> 
    /// Constructor of GroupMemory class. 
    /// </summary> 
    public GroupMemory() 
    { 
     Items = new Dictionary<string, ItemRow>(); 
     Instances = new Dictionary<int, Instance>(); 
    } 
} 

У меня есть ListView, что я связать GroupMemory объект каждого элемента ListView. Последний столбец списка - это ComboBox, что мне нужно привязать идентификатор каждого экземпляра groupmemory в нем. например, если каждая группа памяти содержит два экземпляра, а экземпляры имеют Id = 1 и Id = 2, я хочу показать 1 и 2 в поле со списком в качестве своих элементов. как я могу написать xaml-код для combobox или его код позади?

вот мой XAML код ListView

<ListView.View> 
      <GridView> 
       <GridViewColumn Header="Name" Width="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListView}, Converter={StaticResource starWidthConverter}}" DisplayMemberBinding="{Binding Path=Name}" /> 
       <GridViewColumn Header="Scan Rate" Width="60" DisplayMemberBinding="{Binding Path=ScanRate}" /> 
       <GridViewColumn Header="Instances" Width="60" DisplayMemberBinding="{Binding Path=CountOfInstances}" /> 
       <GridViewColumn Header="Index" Width="100"> 
        <GridViewColumn.CellTemplate> 
         <DataTemplate> 
          <ComboBox Width="50" ItemsSource="{Binding Instances}" SelectedValue="{Binding Id}" DisplayMemberPath="Id"/> 
         </DataTemplate> 
        </GridViewColumn.CellTemplate> 
       </GridViewColumn> 
      </GridView> 
     </ListView.View> 
+0

Как ваш «ListView» на данный момент? – dkozl

+0

@dkozl теперь все столбцы имеют значение, но столбцы combobox не имеют элемента – Mohsen

ответ

2

Предполагая, что DataContext из ComboBox является экземпляром GroupMemory класса, вы можете попытаться связать ComboBox в собственность ItemsSource к Instances.Values и установить DisplayMemberPath для отображения Id каждого Instance:

<ComboBox ItemsSource="{Binding Instances.Values}" 
      DisplayMemberPath="Id" 
      SelectedValuePath="Id"/> 
+0

спасибо за ваш ответ, я установил его как ваш код, но он не работает. Я поместил свой код xaml в main post – Mohsen

+0

Связывание работает только с общедоступными * свойствами *. Попробуйте изменить определение 'Instances' как свойство * вместо * поля *:' public Dictionary Экземпляры {get; set;} ' – har07

+0

Уважаемые @ har07 Я изменяю свое определение на публичные свойства, такие как ваш данный код, но он больше не работает :( – Mohsen

2

Если связать ItemSource свойству Экземпляры вы могли бы связать DisplayMember и/или ValueMember на ключ или значение.

относительно несложная

Экземпляры является KeyValuePair, вам нужно будет связываться с Value.Id

Однако я также заметил, что ни один из ваших классов реализации INotifyPropertyChanged. Вам нужно будет реализовать это, так как это означает, что Binding знает, что ваши значения были обновлены.

Вам также может потребоваться проверить ObservableDictionary, если вы застряли в использовании словаря. http://blogs.microsoft.co.il/shimmy/2010/12/26/observabledictionarylttkey-tvaluegt-c/

+0

, спасибо Dale, но это не сработало для меня :( – Mohsen

+0

Свойство Instances - KeyValuePair. Вам нужно будет привязать к Value.Id, That should заставьте его работать –

+0

спасибо @Dale. Я меняю свой словарь на список, и он работает правильно. спасибо за ваш совет, дорогой друг – Mohsen

3

Ваш Instances объявлен поле и недействительно binding source. Вы должны преобразовать его в свойство, если хотите связать его. Изменить объявление на:

public Dictionary<int, Instance> Instances { get; set; } 

, а затем, потому что это Dictionaty<K, V>, и каждый элемент имеет KeyValuePair<K, V> типа, где Key ваш int и Value это ваше Instance попробуйте изменить DisplayMemberPath к Value.Id

<ComboBox ItemsSource="{Binding Instances}" DisplayMemberPath="Value.Id"/> 
Смежные вопросы