MVVM WPF ViewModel DispatcherTimer не обновляет представление? - PullRequest
0 голосов
/ 05 марта 2019

У меня есть DispatcherTimer в моей ViewModel, который я могу видеть стрельбу каждый интервал, но представление не обновляется?

данные фида поступают из URL-адреса xml, и я пытаюсь обновлять форму каждые xсекунд.Возможно более или менее метки / другой статус

вот фрагменты кода:

ViewModel.cs

public class Nodes
{
public string name { get; set; }
public string id { get; set; }
public string status { get; set; }
public string last { get; set; }
public int level { get; set; }
public string parent { get; set; }
}

public ObservableCollection<CI> CIs
{
get;
set;
}

DispatcherTimer LogTimer;

public void LoadCIs()
{
ObservableCollection<CI> cis = new ObservableCollection<CI>();

LogTimer = new DispatcherTimer();
LogTimer.Interval = TimeSpan.FromMilliseconds(10000);

LogTimer.Tick += (s, e) =>
{
    //pull node list
    List<Nodes> SortedList = PopulateNodes();

    foreach (Nodes Node in SortedList)
    {
        //create labels for all top level nodes
        if (Node.level == 3)
        {
            cis.Add(new CI { NodeName = Node.name, NodeStatus = Node.status });
        }
    }

    CIs = cis;

};

LogTimer.Start();

}

Model.cs

public class CI : INotifyPropertyChanged {
  private string nodeName;
  private string nodeStatus;

    public string NodeName { 
     get { 
        return nodeName; 
     }

     set { 
        if (nodeName != value) { 
           nodeName = value; 
           RaisePropertyChanged("NodeName"); 
        } 
     } 
  }

    public string NodeStatus
    {
        get
        {
            return nodeStatus;
        }

        set
        {
            if (nodeStatus != value)
            {
                nodeStatus = value;
                RaisePropertyChanged("NodeStatus");
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

  private void RaisePropertyChanged(string property) {
     if (PropertyChanged != null) {
        PropertyChanged(this, new PropertyChangedEventArgs(property));
     } 
  } 
   } 

view.xaml

<Grid> 
    <ItemsControl ItemsSource = "{Binding Path = CIs}">

            <ItemsControl.ItemTemplate>
                <DataTemplate>
                <Grid>
                    <Label Content = "{Binding Path = NodeName, Mode = OneWay}" 
                        Background = "{Binding Path = NodeStatus, Mode = OneWay}" 
                        Foreground="White"
                        FontFamily="Arial Black"
                        HorizontalContentAlignment="Center"                            
                        BorderBrush="Black" 
                        BorderThickness="1,1,1,1"/>

                </Grid>
                </DataTemplate>
            </ItemsControl.ItemTemplate>

    </ItemsControl>

</Grid>

как должна выглядеть форма без включенного / закомментированного таймера:

enter image description here

с кодом таймера ничего не включенодобавлено в сетку:

enter image description here

Спасибо за внимание

1 Ответ

0 голосов
/ 05 марта 2019

Проблема:

Вы изменяете коллекцию CIs, но не уведомляете ее об изменении. ObservableCollections сообщать об их изменениях, но вы перезаписываете его, он не сообщит об этом.


Вариант 1:

Поскольку вы используетеObservableCollection вы можете добавить его непосредственно в связанную коллекцию, и он автоматически уведомит пользовательский интерфейс.Так что вместо:

cis.Add(new CI { NodeName = Node.name, NodeStatus = Node.status });

Сделайте это:

CIs.Add(new CI { NodeName = Node.name, NodeStatus = Node.status });

, если вы сделаете это, вы должны сначала инициализировать CIs:

public ObservableCollection<CI> CIs
{
    get;
    set;
} = new ObservableCollection<CI>(); // < initialize it

Вариант 2:

Добавьте интерфейс INotifyPropertyChanged к классу Nodes и отправьте уведомление таким образом:

this.PropertyChanged?.Invoke( this, new PropertyChangedEventArgs( nameof( this.CIs ) ) );

inсеттер CIs

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...