【问题标题】:How to update TextBlock text inside of ListBox item如何更新 ListBox 项内的 TextBlock 文本
【发布时间】:2016-03-19 20:47:22
【问题描述】:

所以我有一个来自 WinForm 项目的简单 UDP 聊天应用程序,我想让它看起来更好一点,所以我在 WPF 中重新制作它。当我意识到我可以轻松地将 2 个或更多 TextBlocks 放入 ListItem 时,我想显示每个聊天的最后一条消息,如下所示:

但我不知道如何编辑那些 TextBlocks :( 我刚开始使用 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>

【问题讨论】:

  • “如何处理那些 TextBlocks”是什么意思?你的TextBlocks 看起来不错。您的项目视图模型是什么样的?是否有public NameIDLastMessage properties
  • 对不起,我的意思是如何编辑它们。每次客户收到一条消息时,我都想插入最后一条消息。例如这样的:ListBox.Items[0].last_message.text = "Hi, this is Zalma";
  • 您不能编辑它们。您在视图模型中更改绑定的LastMessage 属性,如果引发INotifyPropertyChanged.PropertyChanged 事件,它将被UI 拾取并且TextBlock 将被刷新。你的视图模型类是什么样子的?
  • 抱歉,不知道什么是视图模型
  • 每个项目后面都有一个类。我猜您将myList.ItemsSource 设置为IEnumerable&lt;MyItem&gt; 的某个实现,其中MyItem 是您的视图模型,应该具有NameIDLastMessage 属性。如果不是,你如何填充你的列表?

标签: c# wpf xaml mvvm listbox


【解决方案1】:

这是显示主体的简化模型,但如果您要创建实现 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 列表及其项目进行操作。如果您在集合中添加/删除项目,它将在 UI 中添加/删除项目,如果您更改项目的属性,它将更新 UI 中的绑定属性

【讨论】:

  • 它也可以双向工作,例如,如果您使用TextBox 而不是TextBlock 并允许用户编辑Name,例如UI 会自动更新视图模型中的绑定属性。
猜你喜欢
  • 2012-02-27
  • 1970-01-01
  • 1970-01-01
  • 2010-11-06
  • 2013-06-30
  • 1970-01-01
  • 2023-03-28
  • 2016-07-07
  • 1970-01-01
相关资源
最近更新 更多