【问题标题】:Get checked items in treeview在树视图中获取选中的项目
【发布时间】: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 集合更改为派生的 La​​yer 类时,它停止工作。
  • 您可以尝试附加属性的方法,如this SO post's answer 解释。
  • 也许另一种选择是创建一个LayerContainer类,它内部有一个Layer类型的属性。所以你现在有一个 ObservableCollection,并且那个类会有 IsCurrentlySelected?除此之外,我怀疑唯一剩下的就是你想要的(命令):/

标签: c# wpf xaml checkbox binding


【解决方案1】:

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

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

【讨论】:

  • 我已经更新了我的答案,以修复关于 Layer 对象将包含在何处的错误部分。我没有仔细阅读xaml,只是说Layer 对象应该包含在TreeViewItem.DataContext 中。任何明显的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-10
  • 1970-01-01
相关资源
最近更新 更多