如何让ListBox使用项目的ToString方法自动刷新条目?

时间:2011-05-01 00:39:07

标签: c# wpf

我有ListBoxObservableCollection<HostEntry>HostEntry实施INotifyPropertyChanged。目前,我这样绑定他们:

        lstHosts.DataContext = _hosts;
        lstHosts.DisplayMemberPath = "HostName";

哪个效果很好。当我编辑其中一个HostEntries的名称时,ListBox会自动刷新,显示新名称。

但是,我宁愿让它显示HostEntry.ToString(),因为它默认显示(不设置DiplayMemberPath,但如果我这样做,列表就不会刷新。我相信这是因为HostName属性会触发PropertyChanged事件,但没有任何信号表明ToString()已更改。

我可以在这个方法中添加一些东西:

    protected void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

通知ListBox它应该刷新此项?

我不喜欢明确调用ListBox.Items.Refresh()的想法...如果我错过了一个案例,或者该列表有多个视图,该怎么办?它也不应该被包含在集合中,因为如果我想使用HostEntry的不同集合呢?应该是在HostEntry类内某处做的一种方式,不是吗?


修改:我想使用ToString()因为我不想只显示HostName属性。我想用一些其他属性做一些字符串格式化,我可以在ToString()中轻松完成。

2 个答案:

答案 0 :(得分:3)

数据绑定仅按您希望它使用ToString()方法处理不可变类和结构的方式工作。也就是说,要更改ToString()的值,您必须替换列表框准备处理的可观察集合中的条目。

如果您想使用可变类来模拟对ToString()的完全支持,我恐怕您必须创建一个属性,例如调用AsString,并在任何事情时正确通知所有更改这可能会影响价值。这种情况违背了你的用例。

答案 1 :(得分:1)

您是否尝试过为列表框设置ItemTemplate而不是像这样设置DisplatMemberPath -

            <ListBox.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding HostName}"/>
                </DataTemplate>
            </ListBox.ItemTemplate>

我想如果没错的话,这就是你想要的...... ??