C# WPF 用户界面未更新

C# WPF User interface not getting updated

我正在尝试使用 MVVM 学习 WPF,但遇到了一个我无法解决的问题。我试图在弹出窗口 window 上显示 3 个列表,但我想从 MainView 模型(列表在 reportviewmodel 中)将值插入到这些列表中。问题是,如果我从 reportviewmodel 的构造函数中添加值,它们就会出现,但如果我想从 MainViewModel 添加它们,它们就不会出现。在调试器中一切正常,但它没有显示在 U.I 上。谢谢


XAML

 <Popup x:Name="Pop" IsOpen="{Binding IsChecked, ElementName=PCheckBox}"
            PlacementTarget="{Binding ElementName=PCheckBox}"           
            AllowsTransparency="True"
            PopupAnimation="Slide"
            HorizontalOffset="450"
            VerticalOffset="-60"
            Margin="0,0,8,8"

/>

            <Border   BorderThickness="1" BorderBrush="Black">
                <Grid DataContext="{Binding}" Width="300" Height="300" Background="Gainsboro" Margin="0">
                    <Grid.RenderTransform>
                        <RotateTransform x:Name="theTransform" />
                    </Grid.RenderTransform>
                    <Button Width="50" Height="50" HorizontalAlignment="Left" Command="{Binding AbortCommand, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}" VerticalAlignment="Bottom" Content="Abort"/>
                    <TreeView>
                        <TreeView.DataContext>
                            <vm:ReportViewModel/>
                        </TreeView.DataContext>
                        <TreeViewItem Header="Error" IsExpanded="True">
                            <ListView>
                                <GridViewColumn  DisplayMemberBinding="{Binding Error}"/>
                            </ListView>
                        </TreeViewItem>
                        <TreeViewItem Header="Warning" IsExpanded="True">
                            <ListView>
                                <GridViewColumn  DisplayMemberBinding="{Binding Warning}"/>
                            </ListView>
                        </TreeViewItem>
                        <TreeViewItem Header="Information" IsExpanded="True">

                            <ListView>
                                <GridViewColumn  DisplayMemberBinding="{Binding Information}"/>
                            </ListView>
                        </TreeViewItem>
                    </TreeView>

                </Grid>
            </Border>
        </Popup>

MainViewModel

class AdminViewModel : ViewModelBase
{
   private RelayCommand generateCommand;
   public RelayCommand GenerateCommand{    get { return generateCommand; } }    
   public AdminViewModel()
    {
        generateCommand = new RelayCommand(o => { Generate(); });
        abortCommand = new RelayCommand(o => { abort(); });
        rvm = new ReportViewModel(); 
    }
   rvm = new ReportViewModel();
   private ReportViewModel rvm;

   private async void Generate()
   {
       prg = new Progress();
       Text = "starting";
       Step = 15;
       if (CadFilePath == string.Empty) //always true
       {
            rvm.LogError("Warning", "This is a warning");
           IsChecked = true; //for the popup to show
       }

ReportViewModel

 class ReportViewModel : ViewModelBase
{
    private List<string> error;
    public List<string> Error
    {
        get { return error; }
        set
        {
            error = value;
            OnPropertyChanged("Error");
        }
    }
    private List<string> warning;
    public List<string> Warning
    {
        get { return warning; }
        set { warning = value;
            OnPropertyChanged("Warning");
        }
    }

    private List<string> information;
    public List<string> Information
    {
        get { return information; }
        set { information = value;
            OnPropertyChanged("Information");
        }
    }

    public ReportViewModel()
    {
        error = new List<string>();
        warning = new List<string>();
        information = new List<string>();
        Warning.Add("Warning");
        Warning.Add("Warning2");
        Error.Add("404");
    }

    public void LogError(string severity, string err)
    {
        Warning.Add(err);
        Error.Add(err);
        Information.Add(err);

    }

}

}

要设置动态绑定以便集合中的插入或删除自动更新 UI,集合必须实现 INotifyCollectionChanged 接口。此接口公开 CollectionChanged 事件,该事件应在基础集合发生更改时引发。 WPF 提供了 ObservableCollection<T> class,它是实现 INotifyCollectionChanged 接口的数据集合的内置实现。

如果要绑定集合并添加或删除元素,请使用 ObservableCollection<T> 作为容器。它表示一个动态数据集合,在添加、删除项目或刷新整个列表时提供通知。

因此您只需替换 ViewModel 中的集合类型:

class ReportViewModel : ViewModelBase
{
    private ObservableCollection<string> error;
    public ObservableCollection<string> Error
    {
        get { return error; }
        set
        {
            error = value;
            OnPropertyChanged("Error");
        }
    }
    private ObservableCollection<string> warning;
    public ObservableCollection<string> Warning
    {
        get { return warning; }
        set { warning = value;
            OnPropertyChanged("Warning");
        }
    }

    private ObservableCollection<string> information;
    public ObservableCollection<string> Information
    {
        get { return information; }
        set { information = value;
            OnPropertyChanged("Information");
        }
    }

    public ReportViewModel()
    {
        error = new ObservableCollection<string>();
        warning = new ObservableCollection<string>();
        information = new ObservableCollection<string>();
        Warning.Add("Warning");
        Warning.Add("Warning2");
        Error.Add("404");
    }

    public void LogError(string severity, string err)
    {
        Warning.Add(err);
        Error.Add(err);
        Information.Add(err);
    }
}