我正在使用第三方.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"); }
}
这是一个示例:
我知道一种方法是让复选框的 checked
函数绑定到命令,项目本身作为命令参数发送 . 这真的是最好的方法吗?
1 回答
将另一个
ObservableCollection<Layer>
对象绑定到TreeView.Tag
. 注册CheckBox
的Checked
和Unchecked
事件 . 在后面的代码中,sender
的DataContext
属性应包含Layer
对象 . 根据您正在处理的事件,在绑定到TreeView.Tag
的ObservableCollection<Layer>
对象中添加或删除它 . 您可以随时从视图模型访问ObservableCollection<Layer>
对象,您将始终获取所有已选择的Layer
对象 .在我看来,这个解决方案是最有效的,并且不会消除任何MVVM原则 . 如果您认为使用在视图中较低层中定义的类型是不可接受的,则将
TreeView.Tag
转换为IList
接口可以简单地避免这种情况 .