I am writing a chatprogram, and I have a page where the user can select saved chathistories. They are all in a ListView with 2 columns: Date and Partner. To have 2 columns, I found a solution by writing my own entry class (Add Items to Columns in a WPF ListView). This is my 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(); } }
}
The entrystring is a specially formatted string: <timeinepoch>"|"<partner>("|"<othermembers>)+
, for e.g. 1619819688|ExampleUser1|ExampleUser2
So I have a ListView with 2 columns, and if the user clicks on an item (I found how to add clickevent here: WPF ListView - detect when selected item is clicked), it loads the corresponding chat conversation.
The 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>
My problem is, whenever I try to fill the list, I get the following errors:
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')
But when I click on it, it gives me the correct information, and loads the chathistory correctly, so the content is right, only the display is faulty.
So my question is, how could I display those data members in my ListView columns?
The way I fill the 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
}
}