在 WPF C# 中填充组合框项

本文关键字:组合 填充 WPF | 更新日期: 2023-09-27 18:26:16

我有两个这样的类:

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 的最后一列是一个组合框,我需要在其中绑定每个组内存实例的 Id。例如,如果每个组内存包含两个实例,并且实例具有 Id=1 和 Id=2,我想在 Combobox 中显示 1 和 2 作为其项目。如何为 Combobox 或其代码隐藏编写 XAML 代码?

这是我的列表视图的 XAML 代码

<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>

在 WPF C# 中填充组合框项

假设 ComboBox 的DataContextGroupMemory类的实例,您可以尝试将 ComboBox 的 ItemsSource 绑定到Instances.Values属性,并将DisplayMemberPath设置为显示每个InstanceId

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

您的Instances声明为字段,它不是有效的绑定源。如果要绑定到属性,则应将其转换为属性。将声明更改为:

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

然后,因为它是Dictionaty<K, V>,并且每个项目都属于KeyValuePair<K, V>类型,其中Key是您intValue是您Instance请尝试将DisplayMemberPath更改为Value.Id

<ComboBox ItemsSource="{Binding Instances}" DisplayMemberPath="Value.Id"/>

如果将 itemsource 绑定到 Instances 属性,则可以将 DisplayMember 和/或 valueMember 绑定到键或值。

它相对简单

实例是一个键值对,您需要绑定到 Value.Id

但是,我也注意到您的两个类都没有实现INotifyPropertyChanged。你将需要实现这一点,因为这是绑定知道你的值已更新的方式。

如果您坚持使用字典,您可能还需要查看 ObservableDictionary。 http://blogs.microsoft.co.il/shimmy/2010/12/26/observabledictionarylttkey-tvaluegt-c/