.net 列表框中带有TargetNullValue的DataTemplate
我在列表框中有以下数据模板.net 列表框中带有TargetNullValue的DataTemplate,.net,wpf,xaml,targetnullvalue,.net,Wpf,Xaml,Targetnullvalue,我在列表框中有以下数据模板 <ListBox Grid.Column="1" Grid.Row="2" ItemsSource="{Binding People}" SelectedItem="{Binding SelectedPerson}"> <ListBox.ItemTemplate> <DataTemplate> <TextBlock OverridesDefaultStyle="True"
<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>
这非常有效,在绑定列表中显示“None”而不是任何Null(Nothing)值。问题是我不能点击空值来选择它们。使用键盘进行选择是完美的,只是不需要鼠标。如何使列表中的空值与任何其他值一样工作
编辑:我还应该补充一点,我可以将文本块的背景更改为红色,并且它的显示与其他文本块一样,因此我不认为这是一种无需单击的情况。我还使用Snoop查看了它,在可视化树中没有看到空项和普通项之间有任何不同的属性
编辑2:我应该补充一点,People实际上是一个表示数据库表的类。默认情况下,它使用ToString方法显示人员对象。如果我使用路径选项绑定到正确的字段,我会得到同样的效果,我认为这会更容易阅读。这就是我认为正在发生的情况:- 我假设ItemSource是裸字符串值的简单集合(即未封装在另一个类中)。在对象上按鼠标键时,隐藏代码会将集合中项目的对象引用复制到列表框的SelectedItem字段 因此,如果集合为:-“Fred”,null,“Jane”,“Mary”,并且您将鼠标按在“Fred”上,则“Fred”的对象引用将复制到SelectedItem。如果按第二项,该对象引用(null)将复制到SelectedItem 问题是SelectedItem中的NULL值实际上意味着没有选择任何项的特殊情况 即使在TargetNullValue属性中指定了“无”,也不会将“无”复制到SelectedItem。当collection元素包含NULL值时,这只是一种视觉表示。listbox只对集合的对象引用感兴趣,而对UI中显示的内容不感兴趣 解决此问题的一种方法是使用名为“name”的字符串字段创建非空对象集合 e、 g
即使名称为空,每个元素的SelectedItem现在也将为非空,但您的缺点是SelectedItem现在不再是所选名称的字符串,而是对所选人员对象的引用。如果您正在寻找解决方案,也许您可以在此处找到所需内容:
Combobox的行为与ListBox相同。下面的博客提供了一个很好的解决方案,它使用了Attached属性,这对我来说很好
当选择更改为虚线边框而不是蓝色背景时,键盘似乎无法选择该项目。非常奇怪。它会这样做,但如果你在setter中放置断点,它会被调用,因此选择会发生,listbox只是以不同的方式突出显示选择。我刚刚对控件运行了Snoop,我无法分辨出区别。所有项目都是ListBoxItems,但我无法发现差异,我只是花了一段时间在Reflector中尝试查看渲染工作方式的任何更改。不幸的是,我已经绑定到一个更复杂的对象。所以这不是你所说的一个可为空的问题。谢谢你的建议,我会更新我的问题。谢谢。我注意到这个问题时,它最初是张贴和评论,他们的答案将是相同的。
class People
{
string Name {get;set;}
}
...
...
var list = new List<People> {new People {Name = "Fred"},
new People {Name = null},
new People {Name = "Jane"},
};
Text="{Binding Path=Name, TargetNullValue=None}"