2016-03-19 3 views
1

Итак, у меня есть простое приложение чата UDP из проекта WinForm, которое я хотел бы выглядеть немного лучше, поэтому я переделываю его в WPF. Как я понял, что я могу легко поставить 2 или более TextBlocks внутри ListItem, я хотел, чтобы отобразить последнее сообщение каждого чата, например, так:Как обновить текст TextBlock внутри элемента ListBox

Last message...

Но я понятия не имею о том, как изменить этот TextBlocks :(Я литературный только начал с WPF, так что я держал пари, я только что сделал дубликат, но из-за этого, я даже не знаю, как искать этот вопрос

Вот обычай ListBox:.

<ListBox x:Name="myList" HorizontalAlignment="Left" Width="264" ScrollViewer.VerticalScrollBarVisibility="Hidden" ScrollViewer.HorizontalScrollBarVisibility="Disabled" BorderThickness="0,1,1,0" MouseLeftButtonUp="myList_MouseLeftButtonUp" Margin="0,25,0,0"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <Border BorderBrush="LightGray" BorderThickness="0,0,0,1" Width="250"> 
        <DockPanel Margin="0,7"> 
         <Ellipse Name="ellipse" Margin="5" DockPanel.Dock="Left" Style="{DynamicResource elstyle}"> 
         </Ellipse> 
         <TextBlock Text="{Binding Name}" DockPanel.Dock="Top" Margin="0,0,0,7" FontWeight="Bold" MaxWidth="250"></TextBlock> 
         <TextBlock Text="{Binding ID}" DockPanel.Dock="Top" Visibility="Hidden" FontSize="1.333"></TextBlock> 
         <TextBlock x:Name="last_message" Text="{Binding LastMessage}" DockPanel.Dock="Bottom" MaxWidth="250"></TextBlock> 
        </DockPanel> 
       </Border> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 
+0

Что вы подразумеваете под _ «как обращаться к этим текстовым блокам», _? Ваши «TextBlocks» выглядят отлично. Как выглядит модель вашего элемента? Имеет ли он ** общедоступные свойства ** Name, 'ID' и' LastMessage' ** **? – dkozl

+0

Извините, я имел в виду, как их редактировать. Я хотел бы вставить последнее сообщение каждый раз, когда клиент получает его. Например, что-то вроде этого: 'ListBox.Items [0] .last_message.text =" Привет, это Zalma ";' – Caddaile

+0

Вы их не редактируете. Вы изменяете связанное свойство LastMessage в своей модели представления, и если это вызывает ['INotifyPropertyChanged.PropertyChanged'] (https://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.propertychanged (v = vs .110) .aspx), он будет подхвачен пользовательским интерфейсом, и «TextBlock» будет обновлен. Как выглядит классный класс? – dkozl

ответ

4

Это упрощенная модель, чтобы показать основную, но если вы можете создать вид модели класса, которые реализуют INotifyPropertyChanged интерфейс для хранения ваших данных элемента

public class MyItem : INotifyPropertyChanged 
{ 
    private string _name; 

    private string _id; 

    private string _lastMessage; 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void OnPropertyChanged(string propertyName) 
    { 
     var handler = this.PropertyChanged; 
     if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 

    public string Name 
    { 
     get { return _name; } 
     set 
     { 
      _name = value; 
      OnPropertyChanged("Name"); 
     } 
    } 

    public string ID 
    { 
     get { return _id; } 
     set 
     { 
      _id = value; 
      OnPropertyChanged("ID"); 
     } 
    } 

    public string LastMessage 
    { 
     get { return _lastMessage; } 
     set 
     { 
      _lastMessage = value; 
      OnPropertyChanged("LastMessage"); 
     } 
    } 
} 

, а затем в окне

public partial class MainWindow : Window 
{ 
    private readonly ObservableCollection<MyItem> _myItems = new ObservableCollection<MyItem>(); 

    public MainWindow() 
    { 
     InitializeComponent(); 
     myList.ItemsSource = _myItems; 
     _myItems.Add(new MyItem { Name = "name", ID = "id", LastMessage = "last message" }); 
     _myItems[0].LastMessage = "new message"; 
    } 
} 

, и тогда вы не работают на myList контроль больше, но на _myItems список и его пункты. Если вы добавите/удалите элемент в коллекции, он добавит/удалит элемент в пользовательском интерфейсе, если вы измените свойство элемента, оно обновит связанное свойство в пользовательском интерфейсе.

+0

Он работал на 100%, даже для .Clear(); Спасибо! – Caddaile

+0

Он также будет работать в обоих направлениях, так что, например, у вас будет 'TextBox' вместо' TextBlock' и разрешите пользователям редактировать 'Name', например, пользовательский интерфейс автоматически обновит свойство привязки в вашей модели представления. – dkozl

Смежные вопросы