У меня есть два таких класса:
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>
Предполагая, что DataContext
ComboBox является экземпляром класса GroupMemory
, вы можете попытаться привязать ItemsSource
ComboBox ItemsSource
к свойству Instances.Values
и установить DisplayMemberPath
для отображения Id
каждого Instance
:
<ComboBox ItemsSource="{Binding Instances.Values}"
DisplayMemberPath="Id"
SelectedValuePath="Id"/>
Instances
чтобы оно было свойством вместо поля : public Dictionary<int, Instance> Instances { get; set; }
Ваши 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"/>
Если вы привязываете источник items к свойству Instances, вы можете привязать DisplayMember и/или valuemember к ключу или значению.
Его относительно просто
Экземпляры - это KeyValuePair, вам нужно привязать к Value.Id
Однако я также заметил, что ни один из ваших классов не реализует INotifyPropertyChanged. Вам нужно будет реализовать это, так как это означает, что Binding знает, что ваши значения были обновлены.
Вам также может потребоваться проверить ObservableDictionary, если вы застряли в использовании словаря. http://blogs.microsoft.co.il/shimmy/2010/12/26/observabledictionarylttkey-tvaluegt-c/
ListView
на данный момент?