将数据从服务添加到视图模型时,为什么视图不更新?

时间:2018-11-20 15:17:04

标签: c# .net wpf mvvm

所以我刚刚创建了一个新项目,我试图在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模式。

2 个答案:

答案 0 :(得分:1)

from A import app是一类,BaseViewModel是另一类。您不能期望添加到ProxyService对象中的对象会影响前者,反之亦然。尝试将MessageModel设置为DataContext

BaseViewModel

答案 1 :(得分:1)

三个要点。

  1. 您要将Window的DataContext设置为BaseViewModel的一个实例,然后创建ProxyServiceClass的单​​独实例。

  2. 您对ItemsControl的绑定。ItemsSource应该仅绑定到DataContext的属性,在本例中为Messages。

  3. 不要继续创建ObservableCollection-只需创建一次,然后根据需要添加/删除项。任何绑定的控件都会检测到它实现了InotifyCollectionChanged,并在更新集合时自动刷新自身。