首页 文章

在treeview中获取选中的项目

提问于
浏览
0

我正在使用第三方.dll,其中包含一种名为 Layer 的对象 . 我在viewmodel中有这些图层的集合 . 在我看来,我有一个 TreeView ,其 ItemsSource 绑定到图层集合 . 我还有一个每个项目的复选框 .

我想以某种方式得到所有已检查的 Layer 项目 .

通常我会在对象的类中创建一个名为IsChecked的公共布尔属性,但 Layer 没有该属性 .

这是xaml:

<TreeView Grid.Row="1" Grid.Column="0">
    <TreeViewItem Header="Shape Files" ItemsSource="{Binding Layers}" >
        <TreeViewItem.ItemTemplate>
            <DataTemplate>
                <StackPanel>
                    <CheckBox Content="{Binding Name}" />
                </StackPanel>
            </DataTemplate>
        </TreeViewItem.ItemTemplate>
    </TreeViewItem>
</TreeView>

这是视图模型:

public ObservableCollection<Layer> Layers
{
    get { return mapModel.Layers; }
    set { mapModel.Layers = value; OnPropertyChanged("Layers"); }
}

这是一个示例:

enter image description here

我知道一种方法是让复选框的 checked 函数绑定到命令,项目本身作为命令参数发送 . 这真的是最好的方法吗?

1 回答

  • 1

    将另一个 ObservableCollection<Layer> 对象绑定到 TreeView.Tag . 注册 CheckBoxCheckedUnchecked 事件 . 在后面的代码中, senderDataContext 属性应包含 Layer 对象 . 根据您正在处理的事件,在绑定到 TreeView.TagObservableCollection<Layer> 对象中添加或删除它 . 您可以随时从视图模型访问 ObservableCollection<Layer> 对象,您将始终获取所有已选择的 Layer 对象 .

    在我看来,这个解决方案是最有效的,并且不会消除任何MVVM原则 . 如果您认为使用在视图中较低层中定义的类型是不可接受的,则将 TreeView.Tag 转换为 IList 接口可以简单地避免这种情况 .

相关问题