Mam aplikację WPF, w której procedura C# w pętli wykonuje obliczenia, które trochę trwają. Chciałbym wyniki obliczeń każdej pętli wyświetlać w** ListView (XAML), ale kontrolka nie chce się odświeżać. Wszystkie wyniki pojawiają się po wyjściu z procedury. Gdy na próbę w pętli umieściłem MessageBox.Show(‘’xx’’), to ListView** jest uzupełniany (odświeżany). Jak z tego wybrnąć? Proszę o pomoc.
Poniżej kod związany z moim problemem.
kontrolka XAML:
<ListView x:Name="Podgląd" FontFamily="Arial" FontSize="16" HorizontalContentAlignment="Center" ScrollViewer.VerticalScrollBarVisibility="Auto" BorderBrush="Black" BorderThickness="2" Background="LightYellow" Margin="97,232,41,90" >
<ListView.View >
<GridView AllowsColumnReorder="False" >
<GridView.ColumnHeaderContainerStyle>
<Style TargetType="GridViewColumnHeader">
<Setter Property="FontSize" Value="20"/>
<Setter Property="Foreground" Value="Blue"/>
<Setter Property="HorizontalContentAlignment" Value="Left"/>
</Style>
</GridView.ColumnHeaderContainerStyle>
<GridViewColumn Header="Celownik" Width="150" DisplayMemberBinding="{Binding Path=Cel }"/>
<GridViewColumn Header="Don" Width="150" DisplayMemberBinding="{Binding Path=Don}" />
<GridViewColumn Header="Ic" Width="150" DisplayMemberBinding="{Binding Path=Ic}" />
<GridViewColumn Header="kZb" Width="150" DisplayMemberBinding="{Binding Path=kZb}" />
<GridViewColumn Header="exp" Width="150" DisplayMemberBinding="{Binding Path=exp}" />
</GridView>
</ListView.View>
</ListView>
C#
public class ZmianaWłaściwościPowiadomienie : INotifyPropertyChanged
{
#region INotifyPropertyChanged
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
#endregion INotifyPropertyChanged
}
public class Item : ZmianaWłaściwościPowiadomienie
{
private string cel, don, wsp_kształtu, kzb, wykładnik;
public string Cel
{
get
{
if (!String.IsNullOrEmpty(cel))
{
return cel;
}
else
{
return "";
}
}
set
{
cel = value;
OnPropertyChanged();
}
}
public string Don
{
get
{
if (!String.IsNullOrEmpty(don))
{
return don;
}
else
{
return "";
}
}
set
{
don = value;
OnPropertyChanged();
}
}
// Pozostałe właściwości Item
}
public class Kolekcja : INotifyCollectionChanged, IEnumerable
{
private List<Item> _lstItems = new List<Item>();
public void Add(Item item)
{
_lstItems.Add(item);
OnNotifyCollectionChanged(new NotifyCollectionChangedEventArgs(
NotifyCollectionChangedAction.Add, item));
}
public void Remove(Item item)
{
_lstItems.Remove(item);
OnNotifyCollectionChanged(new NotifyCollectionChangedEventArgs(
NotifyCollectionChangedAction.Remove, item));
}
public void Clear()
{
_lstItems.Clear();
OnNotifyCollectionChanged(new NotifyCollectionChangedEventArgs(
NotifyCollectionChangedAction.Reset,null));
}
public Item this[Int32 index]
{
get
{
return this._lstItems[index];
}
}
#region INotifyCollectionChanged
private void OnNotifyCollectionChanged(NotifyCollectionChangedEventArgs args)
{
if (this.CollectionChanged != null)
{
this.CollectionChanged(this, args);
}
}
public event NotifyCollectionChangedEventHandler CollectionChanged;
#endregion INotifyCollectionChanged
#region IEnumerable
public List<Item>.Enumerator GetEnumerator()
{
return this._lstItems.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return (IEnumerator)this.GetEnumerator();
}
#endregion IEnumerable
}
Kod główny programu:
public partial class MainWindow : Window
{
Kolekcja kolekcja = new Kolekcja();
public MainWindow()
{
InitializeComponent();
Podgląd.ItemsSource = kolekcja;
// Pozostałość
}
// Pozostałość
// Tu jest procedura licząca w pętli i wyświetlająca wyniki
}
W pętli obliczającej stosuję:
kolekcja.Add(new Item(Cel, Don, Ic, kZb, exp));
Pomocy!!!!!
W** WinForms **problem rozwiązywała następująca sekwencja:
List.Add(item);
Application.DoEvents();