WPF将自定义类事件处理程序添加到HierarchicalDataTemplate

时间:2018-08-22 09:58:39

标签: c# wpf event-handling

基本上,我遇到的问题是,当我尝试向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的新手,所以我可能缺少一些东西。

1 个答案:

答案 0 :(得分:1)

ModelNode应该具有ICommand属性,但不能具有事件处理程序。然后,您可以将Command的{​​{1}}属性绑定到CheckBox的源属性:

ICommand

但是您最好在<CheckBox Command="{Binding CommandProperty}" IsChecked="{Binding IsChecked}" VerticalAlignment="Center" /> 属性的setter方法中处理“事件”逻辑。当您选中或取消选中IsChecked时,将设置此设置:

CheckBox