2014-10-11 153 views
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>(); 
    } 
} 

我有我的列表视图中的每一项绑定GroupMemory对象列表视图。 listview的最后一列是一个ComboBox,我需要将其中的一个groupmemory的每个实例的Id绑定在一起。例如,如果每个组内存包含两个实例并且实例的Id = 1和Id = 2,我想在组合框中显示1和2作为它的项目。我怎样才能为combobox或其代码behinde编写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> 
+0

如何你的'ListView'看的那一刻? – dkozl 2014-10-11 06:54:01

+0

@dkozl现在所有的列都有价值,但组合框列没有项目 – Mohsen 2014-10-11 07:05:42

回答

2

假设组合框的DataContextGroupMemory类的实例,你可以尝试组合框的ItemsSourceInstances.Values属性绑定,并设置DisplayMemberPath显示的每个InstanceId

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

感谢您的回复,我将它设置为您的代码,但它不起作用。主要帖子 – Mohsen 2014-10-11 07:10:47

+0

绑定只能使用public *属性*。尝试将'Instances'的定义更改为属性*而不是* field *:'public Dictionary Instances {get; set;}' – har07 2014-10-11 07:14:30

+0

Dear @ har07我将我的定义更改为公共属性,例如您的给定代码,但它不再工作:( – Mohsen 2014-10-11 07:30:29

2

我的XAML代码如果您绑定的ItemSource到实例属性,然后你可以绑定将DisplayMember和/或valuemember到项或值。

其相对简单的

实例是一个KeyValuePair,则需要结合Value.Id

但是我也注意到,无论是你的类执行INotifyPropertyChanged。你将需要实现这一点,因为这是Binding知道你的值已被更新的方式。

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

+0

感谢戴尔,但它并没有为我工作:( – Mohsen 2014-10-11 07:03:24

+0

Instances属性是一个KeyValuePair。您将需要绑定到Value.Id,这应该让它工作 – 2014-10-11 07:36:20

+0

谢谢@Dale。我将我的字典更改为一个列表,它工作正常。感谢您的建议亲爱的朋友 – Mohsen 2014-10-11 08:16:16

3

Instances被声明为一个字段,它不是一个有效的binding source。如果你想绑定它,你应该将它转换为一个属性。更改声明:

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

,然后,因为它是一个Dictionaty<K, V>,每个项目是KeyValuePair<K, V>类型:其中,Key是您intValue是您的Instance尝试改变DisplayMemberPathValue.Id

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