DataGrid, привязанный к ObservableCollection, не обновляется сразу после изменения значений - PullRequest
0 голосов
/ 28 июня 2019

У меня есть ObservableCollection с именем PingStatisticCollection.IP периодически пингуются.Успешность немедленно записывается в элемент ObservableCollection как 0 для успеха, иначе 1. Визуальное обновление пользовательского интерфейса продолжается до завершения теста.Если тест не пройден, тест следующего IP-адреса должен подождать 1000 мсек. Если больше IP-адресов невозможно пропинговать, обновление пользовательского интерфейса длится еще дольше.Как я могу обновить пользовательский интерфейс сразу после тестирования одного IP в цикле?

Части моего представления:

<DataGrid x:Name="grdStatistic" ItemsSource="{Binding PingStatisticCollection, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}" SelectedItem="SelectedPingStatisticElement" 
                      AutoGenerateColumns="False" IsReadOnly="True" AlternatingRowBackground="#FFFFE880"  >
<DataGrid.Columns>
    <DataGridTextColumn Header="IP" Width="100" Binding="{Binding IP}"/>
    <DataGridTemplateColumn Width="70">
        <DataGridTemplateColumn.HeaderTemplate>
            <DataTemplate>
                <StackPanel>
                    <TextBlock>Ping</TextBlock>
                </StackPanel>
            </DataTemplate>
        </DataGridTemplateColumn.HeaderTemplate>

        <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal" >
                    <Image Name="imagegreen" Source="/Resources/green.png" Width="20" Height="20"  Margin="5,0" />
                    <Image Name="imagered"  Source="/Resources/red.png"   Width="20" Height="20"  Margin="5,0"/>
                </StackPanel>
                <DataTemplate.Triggers>
                    <DataTrigger Binding="{Binding Path=actPingSuccess, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" Value="0">
                        <Setter TargetName="imagegreen" Property="Visibility" Value="Visible"/>
                        <Setter TargetName="imagered" Property="Visibility" Value="Collapsed"/>
                    </DataTrigger>
                    <DataTrigger Binding="{Binding Path=actPingSuccess, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" Value="1">
                        <Setter TargetName="imagegreen" Property="Visibility" Value="Collapsed"/>
                        <Setter TargetName="imagered" Property="Visibility" Value="Visible"/>
                    </DataTrigger>
                </DataTemplate.Triggers>
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
    <!-- ... -->
</DataGrid.Columns>
</DataGrid> 

// извлечения из ViewModel:

//Команда привязана к кнопке для проверки работоспособности

void OnTestIP(object sender) 
{
  string sIP;
  bool bSuccess;

  foreach (var p in PingStatisticCollection)  // load from database
  {
    SelectedPingStatisticElement = p;
    lock(p)
    {
      bSuccess = PingHost(p.IP, 1000 );
      SavePingSuccess(p, bSuccess);
// actual success and last 5 tests determine red, yellow, green iconcolor
      DetermineIconColors(p, PingStatisticCollection);
    }
  }
}

private ObservableCollection<PingStatistic> _PingStatisticCollection;
public ObservableCollection<PingStatistic> PingStatisticCollection
{
    get { return _PingStatisticCollection; }
    set
    { _PingStatisticCollection = value;      OnPropertyChanged("PingStatisticCollection"); }
}

//extracts from Model: 

class PingStatistic: INotifyPropertyChanged
{

  private string _IP;
  public string IP     // +
  {
    get { return _IP; }
    set
    {   if (value != _IP)
        {   _IP = value; OnPropertyChanged("IP");}
    }
  }

  public int actPingSuccess       
  {
    get { return _actPingSuccess; }
    set
    {
      _actPingSuccess = value;
      OnPropertyChanged("actPingSuccess");
    }
  } 
}

В данный момент IconColors для всех IP-адресов обновляются после посещения каждого IP-адреса.Я хочу немедленно обновить цвет сразу после посещения и оценки.Кто-нибудь знает, как решить эту проблему?Спасибо, Бернд

1 Ответ

0 голосов
/ 29 июня 2019

Вместо использования foreach, попробуйте использовать Parallel.ForEach вместе с заданием.

await Task.Run(() => Parallel.ForEach(strings, s => { DoSomething(s); //Update the status of IP here));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...