Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 列表框中带有TargetNullValue的DataTemplate_.net_Wpf_Xaml_Targetnullvalue - Fatal编程技术网

.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}"