我正在编写一个聊天程序,并且我有一个页面,用户可以在其中选择保存的聊天历史。它们都在具有 2 列的 ListView 中:日期和合作伙伴。为了有 2 列,我通过编写自己的条目类(在 WPF ListView 中将项目添加到列)找到了解决方案。这是我的 MessageHistoryEntry:
public class MessageHistoryEntry : ListViewItem
{
public int EpochTime { get { return int.Parse(this.Content.ToString().Split("|")[0]); } }
public string[] Usernames { get { return this.Content.ToString().Split("|").Skip(1).ToArray(); } }
public string Partner { get { return this.Content.ToString().Split("|").Skip(1).ToArray()[0]; } }
public string Entrystring { get { return this.Content.ToString(); } set { this.Content = value; } }
public string TimeString { get {
DateTimeOffset dateTimeOffset = DateTimeOffset.FromUnixTimeSeconds(int.Parse(this.Content.ToString().Split("|")[0]));
return dateTimeOffset.ToString(); } }
}
entrystring 是一个特殊格式的字符串:<timeinepoch>"|"<partner>("|"<othermembers>)+
,例如1619819688|ExampleUser1|ExampleUser2
所以我有一个包含 2 列的 ListView,如果用户单击一个项目(我在这里找到了如何添加 clickevent:WPF ListView - 检测何时单击所选项目),它会加载相应的聊天对话。
列表视图:
<ListView Margin="0,0,1027,112" x:Name="ChatHistoryListView" >
<ListView.View>
<GridView>
<GridViewColumn Header="Date" DisplayMemberBinding="{Binding TimeString}"/>
<GridViewColumn Header="Partner" DisplayMemberBinding="{Binding Partner}"/>
</GridView>
</ListView.View>
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<EventSetter Event="PreviewMouseLeftButtonDown" Handler="SelectSaveHistory" />
</Style>
</ListView.ItemContainerStyle>
</ListView>
我的问题是,每当我尝试填写列表时,都会出现以下错误:
System.Windows.Data Error: 40 : BindingExpression path error: 'TimeString' property not found on 'object' ''String' (HashCode=808077091)'. BindingExpression:Path=TimeString; DataItem='String' (HashCode=808077091); target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String')
System.Windows.Data Error: 40 : BindingExpression path error: 'Partner' property not found on 'object' ''String' (HashCode=808077091)'. BindingExpression:Path=Partner; DataItem='String' (HashCode=808077091); target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String')
但是当我点击它时,它给了我正确的信息,并且正确地加载了聊天记录,所以内容是正确的,只是显示有问题。
所以我的问题是,如何在我的 ListView 列中显示这些数据成员?
我填充 ListView 的方式:
private void BeginHistory(object sender, RoutedEventArgs e)
{
string[] histories = misc.GetUserHistoryIDs(curUser.Username); ///getting the chathistory id elements from a controller
foreach(string history in histories)
{
MessageHistoryEntry entry = new MessageHistoryEntry();
entry.Entrystring = history; ///setting the entrystring, which is equivalent to the content now
ChatHistoryListView.Items.Add(entry); ///adding the entry to the list
}
}