代码之家  ›  专栏  ›  技术社区  ›  Bryan Anderson

列表框中带有TargetNullValue的DataTemplate

  •  3
  • Bryan Anderson  · 技术社区  · 16 年前

    我在列表框中有以下数据模板

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

    3 回复  |  直到 16 年前
        1
  •  2
  •   Community CDub    8 年前

    如果您正在寻找解决方案,也许您可以在此处找到您想要的: Why can't I select a null value in a ComboBox?

    Combobox的行为与ListBox相同。

        3
  •  0
  •   Rhys    16 年前

    这就是我认为正在发生的事情:-

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

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

    即使在TargetNullValue属性中指定了“无”,也不会将“无”复制到SelectedItem。当collection元素包含NULL值时,这只是一种视觉表示。listbox只对集合的对象引用感兴趣,而对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"},
                                 };
    

    Text="{Binding Path=Name, TargetNullValue=None}"
    

    即使名称为NULL,每个元素的SelectedItem现在也将为非NULL,但您的缺点是SelectedItem现在不再是所选名称的字符串,而是对所选人员对象的引用。