我在列表框中有以下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(Nothing)值。问题是我无法单击Null值来选择它们。使用键盘进行选择非常有效,而不是使用鼠标。我可以做些什么来使列表中的Null值与其他任何值一样?
编辑:我还应该补充一点,我可以将TextBlock的背景更改为红色,它显示就像其他人一样,所以我不认为这是无法点击的情况。我也用Snoop查看了它,我没有看到可视树中的任何属性在Null项和普通项之间有所不同。
编辑2:我应该补充一点,People实际上是一个表示数据库表的类。默认情况下,它使用ToString方法显示People对象。如果我使用Path选项绑定到正确的字段,我会得到相同的效果,我认为这将更容易阅读。
答案 0 :(得分:2)
如果您正在寻找解决方案,也许您可以在这里找到您想要的内容: Why can't I select a null value in a ComboBox?
Combobox与ListBox具有相同的行为。
答案 1 :(得分:1)
下面的博客提供了一个很好的解决方案,使用附加属性,这对我来说很好
http://danylaporte.blogspot.com/2008/07/wpf-combobox-and-null-values.html
答案 2 :(得分:0)
这就是我的想法: -
我假设ItemSource是一个简单的裸字符串值集合(即没有封装在另一个类中)。当您在对象上按下鼠标按钮时,代码隐藏将集合中项目的对象引用复制到列表框的SelectedItem字段。
所以如果集合是: - “Fred”,null,“Jane”,“Mary”并且你在“Fred”上按下鼠标,那么“Fred”的对象引用被复制到SelectedItem。如果按第二个项目,则该对象引用(null)将复制到SelectedItem。
问题是SelectedItem中的NULL值实际上意味着没有选择任何项目的特殊情况。
即使在TargetNullValue属性中指定了“None”,也不会将“None”复制到SelectedItem。当collection元素包含NULL值时,这只是一个可视化表示。列表框仅对集合的对象引用感兴趣,而不是UI中显示的内容。
这方面的一个方法是使用名为“name”的字符串字段创建一个非null的对象集合。
e.g。
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的Binding中使用: -
Text="{Binding Path=Name, TargetNullValue=None}"
即使名称为NULL,每个元素的SelectedItem现在也将为非NULL,但缺点是SelectedItem现在不再是所选名称的字符串,而是对所选People对象的引用