Заполните элементы ComboBox в WPF C #

1

У меня есть два таких класса:

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 в каждом элементе списка. Последний столбец списка - это 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 на данный момент?
  • 0
    @dkozl теперь все столбцы имеют значение, но в выпадающих списках нет элемента
Теги:
wpf
binding
combobox

3 ответа

2
Лучший ответ

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

<ComboBox ItemsSource="{Binding Instances.Values}"
          DisplayMemberPath="Id"
          SelectedValuePath="Id"/>
  • 0
    спасибо за ваш ответ, я установил его как ваш код, но он не работает. я положил свой код xaml в основной пост
  • 0
    Привязка работает только с публичными свойствами . Попробуйте изменить определение Instances чтобы оно было свойством вместо поля : public Dictionary<int, Instance> Instances { get; set; }
Показать ещё 2 комментария
3

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

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"/>
2

Если вы привязываете источник items к свойству Instances, вы можете привязать DisplayMember и/или valuemember к ключу или значению.

Его относительно просто

Экземпляры - это KeyValuePair, вам нужно привязать к Value.Id

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

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

  • 0
    спасибо Дейл, но у меня это не сработало :(
  • 0
    свойство Instances является KeyValuePair. Вам нужно будет привязать к Value.Id, это должно заставить его работать
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню