树列表与复选框或列表框与多个选择在一个ArcGIS PRO SDK窗格

1512
5
01-17-2021 08:04 PM
FredericPoliart_EsriAU
偶然的因素

使用ArcGIS Pro SDK 2.6,我试图创建一个列表框,用户可以选择超过1个项目(按住shift / Ctrl键+点击)

我可以创建listbox并处理{ItemSource Binding}(用于更新列表)和{SelectedItem Binding}来处理具有的情况一项点击,使用RelayCommand()。

如何将窗格列表框项配置为允许多行选择

谢谢你!


例参考:https://github.com/Esri/arcgis-pro-sdk-community-samples/blob/master/Framework/DockpaneSimple/Dockpa..。

0荣誉
5回复
通过 匿名用户
不适用

@FredericPoliart_EsriAU

为了启用shift/control修饰符的多重选择,我们只需要在关联XAML文件中的ListBox控件的属性中设置SelectionMode="Extended"。

参见Microsoft参考:https://docs.microsoft.com/en-us/dotnet/api/system.windows.controls.listbox?view=net-5.0#remarks

欢呼,
詹姆斯

FredericPoliart_EsriAU
偶然的因素

谢谢@匿名用户
现在下一个问题:我如何在我的ICommand RelayCommand()函数中获得所选项目的列表?
是否需要特殊的{binding} ?(例如:绑定SelectedItem数组?)

项目文件行抑制状态
属性“SelectedItems”没有可访问的setter。

0荣誉
通过 匿名用户
不适用

@FredericPoliart_EsriAU

你可以用xaml中的isselected属性绑定UI

    < /列表框>

因此,在上面的例子中,在您的模型中,应该有一个布尔类型的属性调用IsSelected。

private bool _isSelected;public bool IsSelected {get {return _isSelected;} set {_isSelected = value;this.NotifyPropertyChanged ();}}

从您的中继命令,您可以访问选定的项目通过

物品。Where(i => i. isselected);

列表框控件中没有SelectedItems属性,但您可以扩展它以启用它。

下面是自定义列表框控件类的例子,可以绑定illist集合类型。(任何可以使用的对象列表)

但是我建议你使用他的选择属性方法,因为它更直接。

使用系统;使用System.Collections;使用System.Collections.Generic;使用来;使用text;使用System.Threading.Tasks;使用System.Windows;使用System.Windows.Controls;名称空间ThanExtendControlLibrary。ExtendedControls{公共类CustomListBox: ListBox{公共CustomListBox(){这个。SelectionChanged += CustomListbox_SelectionChanged; } private void CustomListbox_SelectionChanged(object sender, SelectionChangedEventArgs e) { this.SelectedItemsList = this.SelectedItems; } #region SelectedItemsList public IList SelectedItemsList { get { return (IList)GetValue(SelectedItemsListProperty); } set { SetValue(SelectedItemsListProperty, value); } } public static readonly DependencyProperty SelectedItemsListProperty = DependencyProperty.Register("SelectedItemsList", typeof(IList), typeof(CustomListBox), new PropertyMetadata(null)); #endregion } }

与上面的扩展控件一样,您可以在dockpane中使用它

添加xmlns:local="clr-namespace: ThanExtendControlLibrary.ExtendedControls;assembly=[您的assemblyname]:

  

0荣誉
通过 匿名用户
不适用

@FredericPoliart_EsriAU

你看到的那个误差属性“SelectedItems”没有可访问的setter。与SelectedItem属性不同的是,SelectedItems属性是只读的。

我能想到的最简单的方法是在代码隐藏中处理ListBox的SelectionChanged事件,以便在视图模型中执行命令,并将选中的项从事件处理程序传递给命令。

以DockpaneSimple项目为例,这将涉及以下更改-

BookmarkDockpaneViewModel.cs

//添加到#区域私有属性私有ICommand _retrieveSelectedBookmarksCommand;//添加到#区域公共属性公共ICommand RetrieveSelectedBookmarksCommand => _retrieveSelectedBookmarksCommand;//添加到BookmarkDockpaneViewModel()构造器_retrieveSelectedBookmarksCommand = new RelayCommand((selectedBookmarks) => RetrieveSelectedBookmarks(selectedBookmarks), () => true);//添加到#区域私人助手私人无效RetrieveSelectedBookmarks(对象参数){System.Collections.IList selectedItems = (System.Collections.IList)参数;Debug.WriteLine (selectedItems.Count);}

BookmarkDockpane.xaml.cs

//添加到公共部分类BookmarkDockpaneView: UserControl私有void lstBox_OnSelectionChanged(对象发送方,SelectionChangedEventArgs e) {var listSelectedItems = ((ListBox)发送方).SelectedItems;var vm = (BookmarkDockpaneViewModel)this.DataContext;vm.RetrieveSelectedBookmarksCommand.Execute (listSelectedItems);}

BookmarkDockpane.xaml

<网格列表框。行= " 1 "网格。网格列= " 0 "。ColumnSpan="2" Name="LstBookmarks" SelectionMode="Extended" ItemsSource="{Binding ListOfBookmarks}" Margin="5" DisplayMemberPath="Name" SelectionChanged ="lstBox_OnSelectionChanged" BorderBrush="{DynamicResource Esri_BorderBrush}" BorderThickness="2" ItemContainerStyle="{DynamicResource Esri_ListBoxItemHighlightBrush}"/>

0荣誉
狼
通过 金宝搏吧
金宝搏吧
0荣誉