Ваша проблема не в электронном письме, а в том, как вы отображаете элементы в форме.Вы пытаетесь делать что-то в winforms, что хорошо для winforms (вроде), но на самом деле бессмысленно и тяжело в коде WPF.Вы должны немного прочесть о MVVM (множество вопросов здесь по теме).
Вот демонстрация, показывающая, что вы хотите сделать, используя всего несколько строк кода, использующих преимущества инфраструктуры связывания WPF.Вы можете создать новое приложение WPF и скопировать несколько строк (измените мое пространство имен и имена классов в соответствии с приложением, которое вы создаете!) И увидеть его в действии.
Есть одно окно.Я симулирую электронные письма здесь;Вы получите свои электронные письма и выбросите их в коллекцию:
public partial class MainWindow : Window
{
public ObservableCollection<FakeEmail> Emails { get; private set; }
public MainWindow()
{
Emails = new ObservableCollection<FakeEmail>();
// simulates emails being received; you would popoulate with valid emails IRL
Emails.Add(new FakeEmail
{ From = "herp", Subject = "derp", Message = "herp derp" });
Emails.Add(new FakeEmail
{ From = "foo", Subject = "bar", Message = "foo bar" });
Emails.Add(new FakeEmail
{ From = "Binding", Subject = "Rocks", Message = "Binding rocks" });
InitializeComponent();
}
}
/// <summary>
/// I don't have your libraries
/// </summary>
public sealed class FakeEmail
{
public string From { get; set; }
public string Subject { get; set; }
public string Message { get; set; }
}
Я добавил ObservableCollection типа FakeEmail в окно.OC хорошо работают с привязками, так как коллекция уведомляет привязки, когда элементы добавляются или удаляются.
Далее, окно.Обратите внимание, я не показываю здесь определение <Window
, но я назвал это окно emailClient
!
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<ListBox
x:Name="emailList"
ItemsSource="{Binding Emails, ElementName=emailClient}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock
Text="{Binding From}" />
<TextBlock
Text="{Binding Subject}"
TextWrapping="NoWrap"
TextTrimming="CharacterEllipsis" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<TextBlock
Grid.Column="1"
Text="{Binding SelectedValue.Message, ElementName=emailList, FallbackValue='Select an email pls'}" />
</Grid>
Некоторые из лучших замечаний: ListBox ItemsSource привязанный к ObservableCollection, который я определил в окне.ListBox будет прослушивать элементы, входящие и выходящие из этой коллекции, и использовать DataTemplate для отображения пользовательского интерфейса для каждого элемента в коллекции.
Для каждого FakeEmail, который находит ItemTemplate, он создает новый экземпляр DataTemplate и его содержимое и устанавливает DataContext шаблона в экземпляр FakeEmail.Это означает, что в DataTemplate я могу просто привязаться к свойствам экземпляра FakeEmail, и все будет подключено во время выполнения.
ListBox имеет свойство с именем SelectedValue , которое я могу использовать дляпоказать сообщение электронной почты.Когда вы выбираете элемент в ListBox, SelectedValue является экземпляром ItemsSource, который является DataContext объекта DataTemplate;то, что в данный момент отображается в этом элементе в пользовательском интерфейсе.Итак, чтобы показать текущее выбранное сообщение электронной почты, мне просто нужно привязать свойство Message элемента ItemSource SelectedValue, поскольку SelectedValue будет выбранным в настоящий момент письмом.
И это все.Нет прослушивания, нет "\ r \ n" BS.Пара связывает и наблюдаемая коллекция.