【发布时间】:2018-07-05 01:31:58
【问题描述】:
我正在使用第三方 .dll,其中包含一种名为 Layer 的对象。我的视图模型中有这些图层的集合。在我看来,我有一个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 函数绑定到命令,并将项目本身作为命令参数发送。这真的是最好的方法吗?
【问题讨论】:
-
图层是否有属性“IsCurrentlySelected”?如果没有,您可以创建一个派生自 Layer 的类“SelectableLayer”。然后您可以更改 TreeView.ItemContainerTemplate 以将 TreeViewItem.IsSelected 绑定到 SelectableLayer.IsCurrentlySelected。然后您可以遍历您的集合并获取所有选定的图层。
-
不幸的是,它没有。我确实尝试过创建一个派生自 Layer 的 Layer 类,但是有很多问题。主要是因为有很多不同类型的“层”也派生自“层”,所有这些都需要添加到我在视图模型中的 ObservableCollection 中。当我将
Layers集合更改为派生的 Layer 类时,它停止工作。 -
您可以尝试附加属性的方法,如this SO post's answer 解释。
-
也许另一种选择是创建一个LayerContainer类,它内部有一个Layer类型的属性。所以你现在有一个 ObservableCollection
,并且那个类会有 IsCurrentlySelected?除此之外,我怀疑唯一剩下的就是你想要的(命令):/
标签: c# wpf xaml checkbox binding