基本上,我遇到的问题是,当我尝试向HierarchicalDataTemplate
中的复选框添加属性以处理复选框的click事件时,我不知道如何分配自定义ModeNode的类处理程序onclick(object sender, RoutedEventArgs args)
。我可以分配/创建位于主Window类的事件处理程序,它也可以正常工作,但是我认为这不是正确的方法。
我的.xaml文件如下所示
<Window.Resources>
<ResourceDictionary>
<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" />
</Style>
<HierarchicalDataTemplate x:Key="CheckBoxItemTemplate" DataType="{x:Type local:ModelNode}" ItemsSource="{Binding Children, Mode=OneTime}">
<StackPanel Orientation="Horizontal">
<CheckBox
Focusable="False"
IsChecked="{Binding IsChecked}"
VerticalAlignment="Center"
/>
<ContentPresenter
Content="{Binding Name, Mode=OneTime}"
Margin="2,0"
/>
</StackPanel>
</HierarchicalDataTemplate>
</ResourceDictionary>
</Window.Resources>
<Grid Margin="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<TreeView x:Name="SceneTreeView"
ItemContainerStyle="{StaticResource TreeViewItemStyle}"
ItemsSource="{Binding Mode=OneTime}"
ItemTemplate="{StaticResource CheckBoxItemTemplate}">
</TreeView>
</Grid>
这是我用于树形视图的数据类型类
public class ModelNode
{
public List<ModelNode> Children { get; set; }
public string Name { set; get; } = "";
public bool IsChecked { get; set; }
public ModelNode(string name)
{
Name = name;
IsChecked = false;
Children = new List<ModelNode>();
}
public void AddChild(ModelNode m)
{
Children.Add(m);
}
public static void onclick(object sender, RoutedEventArgs args)
{
//logic to handle the Click event
}
}
我是WPF的新手,所以我可能缺少一些东西。
答案 0 :(得分:1)
ModelNode
应该具有ICommand
属性,但不能具有事件处理程序。然后,您可以将Command
的{{1}}属性绑定到CheckBox
的源属性:
ICommand
但是您最好在<CheckBox Command="{Binding CommandProperty}"
IsChecked="{Binding IsChecked}"
VerticalAlignment="Center" />
属性的setter方法中处理“事件”逻辑。当您选中或取消选中IsChecked
时,将设置此设置:
CheckBox