我有ListBox
和ObservableCollection<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()
中轻松完成。
答案 0 :(得分:3)
数据绑定仅按您希望它使用ToString()
方法处理不可变类和结构的方式工作。也就是说,要更改ToString()
的值,您必须替换列表框准备处理的可观察集合中的条目。
如果您想使用可变类来模拟对ToString()
的完全支持,我恐怕您必须创建一个属性,例如调用AsString
,并在任何事情时正确通知所有更改这可能会影响价值。这种情况违背了你的用例。
答案 1 :(得分:1)
您是否尝试过为列表框设置ItemTemplate而不是像这样设置DisplatMemberPath -
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding HostName}"/>
</DataTemplate>
</ListBox.ItemTemplate>
我想如果没错的话,这就是你想要的...... ??