2016-03-19 21 views
1

Bu yüzden, daha iyi bir şekilde bakmak istediğim bir WinForm projesinden basit bir UDP sohbet uygulamasına sahibim, bu yüzden bunu WPF'de yeniden yapıyorum. Ben kolayca ListItem içinde 2 veya daha fazla TextBlocks koyabilirsiniz fark, ben, her sohbetin son mesaj görüntüleyebilir istedim şöyle:ListBox öğesinin içindeki TextBlock metnini nasıl güncellerim?

Last message...

Ama o TextBlocks düzenleme hakkında fikrim yok :(Ben edebi sadece WPF ile başladı, ben sadece bir kopya yapılmış, ancak bu yüzden, ben bile bu konuda aramak için nasıl bilmiyorum bahse İşte

özel 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

'daki bağlı özelliği güncelleyecektir. _ "Bu TextBlock'lara nasıl hitap edeceğiniz" ile ne demek istiyorsunuz? _? TextBlock'larınız iyi görünüyor. Ürün görünüm modeliniz neye benziyor? ** public ** 'Name',' ID' ve 'LastMessage' ** properties ** var mı? – dkozl

+0

Üzgünüz, onları nasıl düzenleyeceğimi kastediyorum. İstemcinin bir tane aldığı her seferinde son mesajı eklemek istiyorum. Örneğin böyle bir şey: 'ListBox.Items [0] .last_message.text =" Merhaba, bu Zalma "; – Caddaile

+0

Onları düzenlemezsiniz. Görünüm modelinize bağlı 'LastMessage' özelliğini değiştirirseniz ve bu durum ['INotifyPropertyChanged.PropertyChanged'] 'i yükseltirse (https://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.propertychanged (v = vs) .110) .aspx) olayı UI tarafından alınacak ve 'TextBlock' yenilenecek. Görünüm modeliniz nasıl görünür? – dkozl

cevap

4

Bu basitleştirilmiş modeli müdürü göstermek ancak görünüm modeli sınıfı oluşturmak olsaydı öğe verileri tutmak için INotifyPropertyChanged arabirimini uygulamak buna pencerenize

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"); 
     } 
    } 
} 

ve sonra

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"; 
    } 
} 

ve sonra çalıştırmayın myList üzerinde artık kontrol, ancak _myItems listesinde ve öğelerinde. Koleksiyona öğe eklediyseniz/kaldırırsanız, UI'de öğe ekleyeceksiniz/kaldıracaksınız, eğer bir öğenin özelliğini değiştirirseniz, UI

+0

.Clear() için bile% 100 çalıştı; Teşekkür ederim! – Caddaile

+0

Ayrıca, her iki şekilde de çalışır. Örneğin, 'TextBlock' yerine 'TextBox' yerine sahip olmanız ve kullanıcıların 'Name' (Düzen) 'i düzenlemelerine izin verirseniz, örneğin UI, görünüm modelinizdeki bağlı özelliği otomatik olarak günceller. – dkozl

İlgili konular