所以我刚刚创建了一个新项目,我试图在ViewModel中向集合中添加一些数据,但是当我向其中添加数据时,它确实会添加但不会更新UI。
这是我设置DataContext的地方,也是我试图向集合中添加一些内容的地方
ProxyService ps;
public MainWindow()
{
InitializeComponent();
DataContext = new BaseViewModel();
ps = new ProxyService();
ps.AcceptConnection();
}
请记住,它确实将其添加到集合中,我调试时没有错误,并且它在集合中实际上是正确的。 ProxyServer.cs
public class ProxyService : MessageViewModel
{
public void AcceptConnection()
{
Messages.Add(new MessageModel { Message = "Awaiting connection..." });
这是BaseViewModel
public class BaseViewModel
{
public MessageViewModel MessageViewModel { get; set; } = new MessageViewModel();
}
当然还有MessageViewModel
public class MessageViewModel : ObservableObject
{
private ObservableCollection<MessageModel> _messages;
public ObservableCollection<MessageModel> Messages
{
get { return _messages; }
set
{
_messages = value;
OnPropertyChanged();
}
}
public MessageViewModel()
{
Messages = new ObservableCollection<MessageModel>();
}
}
这是我要向其中添加数据的ScrolLViewer的XAML
<ScrollViewer Height="380"
Margin="10"
>
<StackPanel>
<ItemsControl ItemsSource="{Binding MessageViewModel.Messages}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock FontFamily="Consolas"
Foreground="#61d73d"
Text="{Binding Message}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
</ScrollViewer>
我面临的问题是,它添加某些内容时不会更新UI 然而!如果我在构造函数中添加一些东西,它就可以正常工作。举个例子,这很好,它会在视图中按比例显示
public MessageViewModel()
{
Messages = new ObservableCollection<MessageModel>();
Messages.Add(new MessageModel { Message = "Hello World!" });
}
我的最佳猜测是,它正在添加到某种形式的另一个实例中,但是我不确定,我真的不想使用单例,因为我觉得那样会破坏MVVM模式。
答案 0 :(得分:1)
from A import app
是一类,BaseViewModel
是另一类。您不能期望添加到ProxyService
对象中的对象会影响前者,反之亦然。尝试将MessageModel
设置为DataContext
:
BaseViewModel
答案 1 :(得分:1)
三个要点。
您要将Window的DataContext设置为BaseViewModel的一个实例,然后创建ProxyServiceClass的单独实例。
您对ItemsControl
的绑定。ItemsSource
应该仅绑定到DataContext的属性,在本例中为Messages。
不要继续创建ObservableCollection-只需创建一次,然后根据需要添加/删除项。任何绑定的控件都会检测到它实现了InotifyCollectionChanged,并在更新集合时自动刷新自身。