4

我在列表框中有以下 DataTemplate

<ListBox Grid.Column="1" Grid.Row="2" ItemsSource="{Binding People}" SelectedItem="{Binding SelectedPerson}">
<ListBox.ItemTemplate>
    <DataTemplate>
        <TextBlock OverridesDefaultStyle="True"
               Background="{x:Null}"
               Margin="0"
               Padding="0"
               IsHitTestVisible="True"
               Text="{Binding TargetNullValue=None}"
        />
    </DataTemplate>
</ListBox.ItemTemplate>

这完美地工作,显示“无”代替绑定列表中的任何空(无)值。问题是我无法单击 Null 值来选择它们。使用键盘进行选择可以完美地工作,而不是使用鼠标。我该怎么做才能使列表中的 Null 值像任何其他值一样起作用?

编辑:我还应该补充一点,我可以将 TextBlock 的背景更改为红色,它的显示方式和其他的一样,所以我认为这不是没有可点击的情况。我也用 Snoop 查看了它,在可视树中没有看到 Null 项目和普通项目之间有任何不同的属性。

编辑2:我应该补充一点,人实际上是一个代表数据库表的类。默认情况下,它使用 ToString 方法显示 People 对象。如果我使用 Path 选项绑定到正确的字段,我会得到相同的效果,我认为这会更容易阅读。

4

3 回答 3

2

如果您正在寻找解决方案,也许您可​​以在这里找到您想要的: 为什么我不能在 ComboBox 中选择空值?

Combobox 具有与 ListBox 相同的行为。

于 2009-02-23T05:03:26.760 回答
1

下面的博客使用附加属性提供了一个很好的解决方案,这对我来说效果很好

http://danylaporte.blogspot.com/2008/07/wpf-combobox-and-null-values.html

于 2012-01-04T09:18:59.427 回答
0

这就是我认为正在发生的事情:-

我假设 ItemSource 是一个简单的裸字符串值集合(即未封装在另一个类中)。当您在对象上按下鼠标按钮时,代码隐藏将集合中项目的对象引用复制到列表框的 SelectedItem 字段。

因此,如果集合是:-“Fred”、null、“Jane”、“Mary”并且您在“Fred”上按下鼠标,则“Fred”的对象引用被复制到 SelectedItem。如果您按下第二个项目,该对象引用 (null) 将被复制到 SelectedItem。

问题是 SelectedItem 中的 NULL 值实际上意味着没有选择任何项目的特殊情况。

即使在 TargetNullValue 属性中指定了“无”,您也不会将其复制到 SelectedItem。这只是集合元素包含 NULL 值时的视觉表示。列表框只对集合的对象引用感兴趣,而不是 UI 中显示的内容。

解决此问题的一种方法是使用名为“name”的字符串字段创建一个非空对象集合。

例如

class People
{
   string Name {get;set;}  
}

...
...

var list = new List<People> {new People {Name = "Fred"},
                             new People {Name = null},
                             new People {Name = "Jane"},
                             };

这将意味着 List 中的任何项目都不会具有 NULL 值。

然后在 DataTemplate 的绑定中使用:-

Text="{Binding Path=Name, TargetNullValue=None}"

即使名称为 NULL,每个元素的 SelectedItem 现在也将不为 NULL,但对您而言,缺点是 SelectedItem 现在不再是所选名称的字符串,而是对所选 People 对象的引用。

于 2009-01-08T14:35:33.930 回答