2016-03-19 22 views
1

私はちょっと見た目をよくしたかったので、WPFで再作成しています。私は簡単のListItemの内側に2つの以上のテキストブロックを置くことができます実現したように、私は、各チャットの最後のメッセージを表示したかったので、のように:リストボックスの項目の中のTextBlockのテキストを更新する方法

Last message...

しかし、私はそれらのテキストブロックを編集する方法については考えています:(私は文学だけでWPFを始めたので、私は、私はちょうど複製を作ったが、そのため、私もこの問題を検索する方法がわからない

ここで賭けカスタムリストボックスです。

<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に対処する方法_?あなたの 'TextBlocks'は上手く見えます。あなたのアイテムビューモデルはどのように見えますか?それは**公開** '名前'、 'ID'と' LastMessage' **プロパティ**を持っていますか? – dkozl

+0

申し訳ありませんが、私はそれらを編集する方法を意味しました。私は最後のメッセージをクライアントが受け取るたびに挿入したいと思います。たとえば、次のようなものです: 'ListBox.Items [0] .last_message.text ="こんにちは、これはザルマです "; – Caddaile

+0

あなたは編集しません。あなたのビューモデルでバウンド 'LastMessage'プロパティを変更し、それが[' INotifyPropertyChanged.PropertyChanged'](https://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.propertychanged(v = vs .110).aspx)イベントはUIによって取得され、 'TextBlock'は更新されます。ビューモデルクラスはどのように見えますか? – dkozl

答えて

4

校長を表示するが、あなたは

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

、その後、あなたが動作しない、あなたのアイテムデータを保持するためにINotifyPropertyChangedインタフェースを実装するビューモデルクラスを作成した場合に単純化したモデルmyListのコントロールではなく、_myItemsのリストとその項目にあります。コレクションのアイテムを追加/削除するとUIのアイテムが追加/削除されます。アイテムのプロパティを変更すると、UIのバウンドプロパティが更新されます

+0

.Clear()の場合でも100%働いていました。ありがとうございました! – Caddaile

+0

これは両方の方法でも動作します。たとえば、 'TextBlock'の代わりに' TextBox'を使用し、ユーザーが 'Name'を編集できるようにする場合、UIはビューモデルのバウンドプロパティを自動的に更新します。 – dkozl

関連する問題