2009-01-07 95 views
3

我已在ListBox中的DataTemplate与TargetNullValue在ListBox

<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> 

这完美的作品,在绑定列表中发生的任何空(没有)值的显示“无”以下的DataTemplate。问题是我无法点击Null值来选择它们。使用键盘进行选择可以完美实现,而不是使用鼠标。我能做些什么来使列表中的空值与任何其他值一样?

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

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

+0

看来这个项目是不可选的键盘作为选择更改为虚线边框,而不是蓝色的提供了一个很好的解决方案背景。很奇怪。 – 2009-01-07 21:15:45

+0

它是这样做的,但如果你在setter中放置了一个断点,它就会被调用,所以选择就会发生,listbox只是以不同的方式突出显示选择。 – 2009-01-07 21:20:01

+0

我刚刚在控件上运行Snoop,我无法分辨它。所有项目都是ListBoxItems,但我无法找到差异,我只是在Reflector中花了一段时间尝试查看渲染如何工作的任何更改。 – 2009-01-07 21:22:26

回答

0

这是什么,我认为正在发生的事情: -

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

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

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

即使在TargetNullValue属性中指定了它,也不会将“None”复制到SelectedItem。这只是在collection元素包含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现在是没有的SelectedItem - 所选名称的字符串更长,但是对所选People对象的引用。

相关问题