我可以在TreeViewItem中使用以下代码动态创建radiobuttons和CheckBoxes:
TreeViewItem parent = createTextInTree("Выпечка", tree);
createCheckBoxChildren("торт Птичье молоко - 350 звезд", parent);
createCheckBoxChildren("пироженное Тирамиссу - 25 UAH", parent);
createCheckBoxChildren("пироженное Тирамиссу - 70 звезд", parent);
createCheckBoxChildren("тарт Вишня - 35 звезд", parent);
parent = createTextInTree("Мороженное", tree);
createRadioButtonsChildren("ванильное - 15 звезд", parent, "grp1");
createRadioButtonsChildren("шоколадное - 15 звезд", parent, "grp1");
createRadioButtonsChildren("клубничное - 15 звезд", parent, "grp1");
parent = createTextInTree("Кофе", tree);
createRadioButtonsChildren("эспрессо - 30 звезд", parent, "grp2");
createRadioButtonsChildren("латте - 25 UAH", parent, "grp2");
createRadioButtonsChildren("латте - 50 звезд", parent, "grp2");
createRadioButtonsChildren("капучино - 35 звезд", parent, "grp2");
方法有:
private TreeViewItem createTextInTree(string content, TreeView tree)
{
TreeViewItem item = new TreeViewItem()
{
Header = content
};
tree.Items.Add(item);
return item;
}
private TreeViewItem createCheckBoxInTree(string content, TreeView tree)
{
TreeViewItem item = new TreeViewItem()
{
Header = new CheckBox()
{
Content = content
}
};
tree.Items.Add(item);
return item;
}
private void createCheckBoxChildren(string content, TreeViewItem item)
{
TreeViewItem child = new TreeViewItem()
{
Header = new CheckBox()
{
Content = content,
}
};
item.Items.Add(child);
}
private void createRadioButtonsChildren(string content, TreeViewItem item, string group)
{
TreeViewItem childRadio = new TreeViewItem()
{
Header = new RadioButton()
{
Content = content,
GroupName = group,
}
};
item.Items.Add(childRadio);
}
控件现在看起来像这样:控制对话框
使用示例:带复选框的TreeView,我成功地使用绑定,如果我只有一个模型的TreeViewItem,但不是在情况下,我有多个。
这是我当前的xaml:
& lt; Window.Resources>& lt; ResourceDictionary.MergedDictionaries>& lt;/ResourceDictionary.MergedDictionaries>
<Style x:Key="TreeViewItemStyle" TargetType="TreeViewItem"> <Setter Property="IsExpanded" Value="True" /> <Setter Property="IsSelected" Value="{Binding IsInitiallySelected, Mode=OneTime}" > <Setter Property="KeyboardNavigation.AcceptsReturn" Value="True" /> <Setter Property="dw:VirtualToggleButton.IsVirtualToggleButton" Value="True" /> <Setter Property="dw:VirtualToggleButton.IsChecked" Value="{Binding IsChecked}" /> <Setter Property="FontSize" Value="30"/> </Style> <Style TargetType="{x:Type TreeView}"> <Style.Resources> <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="#CBE8F6" /> <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Black" /> <SolidColorBrush x:Key="{x:Static SystemColors.ControlTextBrushKey}" Color="Black" /> </Style.Resources> </Style> <Style TargetType="{x:Type TreeViewItem}"> <Setter Property="BorderThickness" Value="1" /> <Style.Triggers> <Trigger Property="IsSelected" Value="True"> <Setter Property="BorderBrush" Value="#26A0DA" /> </Trigger> <MultiTrigger> <MultiTrigger.Conditions> <Condition Property="IsSelected" Value="True" /> <Condition Property="IsSelectionActive" Value="False" /> </MultiTrigger.Conditions> <Setter Property="BorderBrush" Value="#DADADA" /> </MultiTrigger> </Style.Triggers> </Style> <HierarchicalDataTemplate x:Key="RadioButtonItemTemplate" DataType="{x:Type local:FooViewModel2}" ItemsSource="{Binding Children, Mode=OneTime}"> <StackPanel Orientation="Horizontal"> <RadioButton Focusable="False" IsChecked="{Binding IsChecked}" VerticalAlignment="Center" /> <ContentPresenter Content="{Binding Name, Mode=OneTime}" Height="30" Margin="8,0" /> </StackPanel> </HierarchicalDataTemplate> <HierarchicalDataTemplate x:Key="CheckBoxItemTemplate" DataType="{x:Type local:FooViewModel}" ItemsSource="{Binding Children, Mode=OneTime}" > <StackPanel Orientation="Horizontal"> <!-- These elements are bound to a FooViewModel object. --> <CheckBox Focusable="False" IsChecked="{Binding IsChecked}" VerticalAlignment="Center" /> <ContentPresenter Content="{Binding Name, Mode=OneTime}" Height="30" Margin="8,0" /> </StackPanel> </HierarchicalDataTemplate> </ResourceDictionary>
& lt;/Window.Resources>& lt; Window.DataContext>& lt;/Window.DataContext>
<DockPanel> <TreeView x:Name="tree" Width="450" ItemContainerStyle="{StaticResource TreeViewItemStyle}" ItemsSource="{Binding Mode=OneTime}" ItemTemplate="{StaticResource RadioButtonItemTemplate}" /> <StackPanel Background="White"> <Button Command="Undo" Content="Uncheck All" HorizontalAlignment="Stretch" Margin="0,2" Padding="8,0"/> <Button DockPanel.Dock="Bottom" Content="Ok" HorizontalAlignment="Stretch" Margin="0,2" Padding="8,0"/> <Button DockPanel.Dock="Bottom" IsCancel="True" IsDefault="True" Content="Отмена" HorizontalAlignment="Stretch" Margin="0,2" Padding="8,0"/> <Label Name="lblTotalBonusesTitle" Content="Всего бонусов" HorizontalAlignment="Center" FontWeight="Bold" Margin="0,2" Padding="1,0" /> <Label Name="lblTotalBonuses" Content="750" HorizontalAlignment="Center" Margin="0,2" Padding="1,0" /> <Label Name="lblChosenBonusesTitle" Content="Выбрано" HorizontalAlignment="Center" FontWeight="Bold" Margin="0,2" Padding="1,0" /> <Label Name="lblChosenBonuses" Content="320" HorizontalAlignment="Center" FontWeight="DemiBold" Margin="0,2" Padding="1,0" /> <Label Name="lblChosenStrTitle" Content="Выбраны" HorizontalAlignment="Center" FontWeight="Bold" Margin="0,2" Padding="1,0" /> <Label Name="lblChosenStr" Content="" HorizontalAlignment="Center" FontWeight="DemiBold" Margin="0,2" Padding="1,0" /> </StackPanel> </DockPanel>
我决定使用DataTemplateSelector
。这是一个自定义类,其方法根据您需要的任何标准返回DataTemplate
。然后将自定义的DataTemplateSelector
分配给元素:在ListBox
的情况下,它是ItemTemplateSelector
属性。