gpt4 book ai didi

wpf - 如何禁止选择 ListBox 中的项目?

转载 作者:行者123 更新时间:2023-12-02 22:28:39 44 4
gpt4 key购买 nike

我们正在尝试创建一个列表框,其中包含一些用户无法选择的项目。想想分组列表框中的组标题,除了这些是独立的项目(即没有缩进的子项)。我们只想在列表中显示一条消息。

如果有“Foo”项,这是我们当前显示的模型...

Foo 1
Foo 2
Foo 3
-------------- <-- This is of type 'Separator' so it's styled as not-selectable by default.
Add new Foo...
Manage Foos...

...如果没有任何 Foo 项目,我们将显示此...

[No Foo Items]   <-- This one should not be selectable, the same as a separator
-------------- <-- This is of type 'Separator' so it's styled as not-selectable by default.
Add new Foo...
Manage Foos...

现在,我们已经有了正确处理所显示内容的代码(见下文)。我们想知道什么是禁止该条目被选中的正确方法。

我们不知道的是如何设置 ListBoxItem 的样式,以便选择直接跳过它,用户也不能点击它。

代码

有人要我看我的代码,所以就在这里。与问题无关,但应该向人们展示我是如何做到的。

注意:我们在 XAML 中模板化 string.Empty 以显示本地化的“无 xxx 项目”消息。 string.Empty 只是我们可以定位的占位符。

注意 2:FauxData 是用于测试的项目和集合的简单库,因此我不必经常从头开始创建它们。例如,SimpleItemCollection 在构造函数中创建了 10 个 SimpleItem 对象,预先填充了名称、描述、IsSelected 等内容。所有这些都完全支持 INotifyPropertyChanged 和集合更改通知。我对 HierarchicalItemsCollection 有同样的事情,它添加了 Parent、Children 和 IsExpanded 等。它在测试代码和控件时节省了大量工作!

最后,这是来自一个简单的测试或“ Playground ”应用。因此,它不应该代表做事的最佳方式,只是为了展示一个概念。是的,它可以清理很多,但你明白了。

无论如何,关于代码...

using System.Collections.ObjectModel;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Input;
using FauxData;

namespace Playground.ListTest
{
[LaunchEntry("List Test")]
public partial class Main : Window
{
SimpleItemCollection itemsCollection = new SimpleItemCollection(); // Default constructor creates 10 items

public Main()
{
InitializeComponent();
MainListBox.ItemsSource = CreateCompositeCollection();
}

private CompositeCollection CreateCompositeCollection()
{
var EmptyHolder = new ObservableCollection<object>();

itemsCollection.CollectionChanged += (s,e) => {

if(itemsCollection.Count != 0)
EmptyHolder.Clear();
else if(EmptyHolder.Count == 0)
EmptyHolder.Add(string.Empty);

};

var cc = new CompositeCollection();

cc.Add(new CollectionContainer(){ Collection = itemsCollection });
cc.Add(new CollectionContainer(){ Collection = EmptyHolder });
cc.Add(new Separator());
cc.Add(ApplicationCommands.New); // <-- Pops a dialog to enter a new item
cc.Add(ApplicationCommands.Open); // <-- Shows an item management window

return cc;

}

private void Test_Click(object sender, RoutedEventArgs e)
{
if(itemsCollection.Count != 0)
itemsCollection.Clear();
else
itemsCollection.Add(new SimpleItem(){Name = "New item" });
}

}

}

最佳答案

由于 Focusable="false" 没有涵盖所有选项(例如单击并拖动选择)我建议将 IsEnabled 设置为 false .

(灰色文本是 ListBoxItem 样式/模板的问题,所以如果您不喜欢它,您需要覆盖它)

关于wpf - 如何禁止选择 ListBox 中的项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12608135/

44 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com