在ListBox中使用TargetNullValue的DataTemplate

时间:2009-01-07 21:02:14

标签: .net wpf xaml targetnullvalue

我在列表框中有以下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选项绑定到正确的字段,我会得到相同的效果,我认为这将更容易阅读。

3 个答案:

答案 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对象的引用