Я использую шаблон MVVM в своем приложении. У меня есть этот (упрощенный вариант) классы VM:WPF Treeview сложная иерархия
public class MainModule_VM
{
...
public ObservableCollection<Module2601_VM> ListModules{...}
...
}
public class Module2601_VM
{
...
public string GatewayName {...}
public string FirmwareVersion{...}
public string IPAddress{...}
public string NbIoms{...}
public ObservableCollection<Module2610_VM> ListModules{...}
public ObservableCollection<ComPort_VM> ListCOM{...}
...
}
public class Module2610_VM
{
...
public string ModuleName{...}
...
}
public class ComPort_VM
{
...
public string ComPortName{...}
...
}
Так, один Module2601_VM содержит несколько свойств, а также список Module2610_VM и ComPort_VM объектов.
У меня есть один список объектов Module2601_VM в классе MainModule_VM.
Я хочу, чтобы связать эту коллекцию Module2601 и это суб-элементов в Treeview, с этой иерархии:
Шлюзы:
- Шлюз # 0
- IP
- микропрограмм
- NbIoms
- ListModules
- Модуль # 0
- Модуль # 1
- ...
- ListCOM
- COM # 1
- ...
Моя проблема заключается в том, что я получаю иерархию в порядке, но не могу выбрать подпозиции. Он принимает любой элемент шлюза и все его дети как один большой элемент. Я знаю, что это из-за моего itemTemplate, но я не могу решить эту проблему. Вот XAML (DataContext набор в код-сзади):
<TreeView Name="treeView1" >
<TreeViewItem Header="Gateways" ItemsSource="{Binding ListMM}">
<TreeViewItem.ItemTemplate>
<DataTemplate>
<TreeViewItem Header="{Binding GatewayName, Mode=OneWay}" IsExpanded="True">
<TreeViewItem Header="{Binding Path=Gateway.IPAddress, Mode=OneWay}"/>
<TreeViewItem Header="{Binding Path=Gateway.FirmwareVersion, Mode=OneWay}"/>
<TreeViewItem Header="{Binding Path=Gateway.NumberIoms, Mode=OneWay}"/>
<TreeViewItem Header="MIOs" ItemsSource="{Binding ListModules, Mode=OneWay}">
<TreeViewItem.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding ModuleName, Mode=OneWay}" />
</DataTemplate>
</TreeViewItem.ItemTemplate>
</TreeViewItem>
<TreeViewItem Header="COM" ItemsSource="{Binding ListCOM, Mode=OneWay}">
<TreeViewItem.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=PortCom.ComP, Mode=OneWay}"/>
</DataTemplate>
</TreeViewItem.ItemTemplate>
</TreeViewItem>
</TreeViewItem>
</DataTemplate>
</TreeViewItem.ItemTemplate>
</TreeViewItem>
</TreeView>
С этим я не могу выбрать подпункты, это выглядит следующим образом: picture
Теперь следующий пример, где я только есть один пункт Module2601_VM в моей TreeView, это все хорошо, и я могу выбрать отдельные элементы:
<TreeView Name="treeView2">
<TreeViewItem Header="Gateways">
<TreeViewItem Header="{Binding GatewayName, Mode=OneWay}">
<TreeViewItem Header="{Binding Path=IPAddress, Mode=OneWay}"/>
<TreeViewItem Header="{Binding Path=FirmwareVersion, Mode=OneWay}"/>
<TreeViewItem Header="{Binding Path=NumberIoms, Mode=OneWay}"/>
<TreeViewItem Header="MIOs" ItemsSource="{Binding ListModules, Mode=OneWay}">
<TreeViewItem.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding ModuleName, Mode=OneWay}" />
</DataTemplate>
</TreeViewItem.ItemTemplate>
</TreeViewItem>
<TreeViewItem Header="COM" ItemsSource="{Binding ListCOM, Mode=OneWay}">
<TreeViewItem.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=ComPortName, Mode=OneWay}"/>
</DataTemplate>
</TreeViewItem.ItemTemplate>
</TreeViewItem>
</TreeViewItem>
</TreeViewItem>
</TreeView>
Как я могу иметь свой TreeView быть как treeView1 но с treeView2 выбора functionnality? HierarchicalDataTemplate здесь не работает, потому что дочерние элементы имеют различный тип. Спасибо.
Это сработало как прелесть при первой попытке! Большое спасибо! –
Я счастлив, что это помогло! Добро пожаловать –