Пользовательский интерфейс C # WPF не обновляется - PullRequest
0 голосов
/ 03 января 2019

Я пытаюсь изучить WPF с MVVM, и я столкнулся с проблемой, которую не могу понять.Я пытаюсь отобразить 3 списка во всплывающем окне, но я хочу вставить значения в эти списки из MainViewmodel (списки находятся в reportviewmodel).Дело в том, что если я добавлю значения из конструктора reportviewmodel, они появятся, но если я захочу добавить их из MainViewModel, они не будут.В отладчике все работает нормально, но он не отображается на интерфейсе. Спасибо


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);

    }

}

}

1 Ответ

0 голосов
/ 03 января 2019

Чтобы настроить динамические привязки, чтобы вставки или удаления в коллекции автоматически обновляли пользовательский интерфейс, коллекция должна реализовывать интерфейс INotifyCollectionChanged. Этот интерфейс предоставляет событие CollectionChanged, событие, которое должно вызываться всякий раз, когда изменяется базовая коллекция. WPF предоставляет класс ObservableCollection<T>, который является встроенной реализацией сбора данных, который реализует интерфейс 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);
    }
}
...