在treeview中获取选中的项目

时间:2018-01-25 17:47:45

标签: c# wpf xaml checkbox binding

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

我想以某种方式获取所有已检查的ItemsSource项。

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

这是xaml:

Layer

以下是视图模型:

<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>

以下是一个示例:

enter image description here

我知道一种方法是让复选框的public ObservableCollection<Layer> Layers { get { return mapModel.Layers; } set { mapModel.Layers = value; OnPropertyChanged("Layers"); } } 函数绑定到命令,项目本身作为命令参数发送。这真的是最好的方法吗?

1 个答案:

答案 0 :(得分:1)

将另一个ObservableCollection<Layer>对象绑定到TreeView.Tag。注册CheckBox&#39; CheckedUnchecked事件。在后面的代码中,sender的{​​{1}}属性应包含DataContext对象。根据您正在处理的事件,在绑定到Layer的{​​{1}}对象中添加或删除它。您可以随时从视图模型访问ObservableCollection<Layer>对象,您将始终获取所有已选中的TreeView.Tag个对象。

在我看来,这个解决方案是最有效的解决方案,并且没有任何MVVM原则。如果您认为使用在视图中较低层中定义的类型是不可接受的,则将ObservableCollection<Layer>强制转换为Layer接口可以避免这种情况。